RedirectStandardOutput завершает работу процесса - PullRequest
0 голосов
/ 07 июня 2019

Попытка загрузить стороннее приложение в режиме администратора с помощью процесса C # и прочитать его вывод. Однако, когда я пытаюсь использовать RedirectStandardOutput для процесса, он падает через несколько секунд после запуска на ПК с Windows 7. Я могу заставить его нормально работать в Windows 10, но нам также нужно, чтобы он работал и в Windows 7. Мне бы хотелось, чтобы процесс мог нормально работать, и чтобы я считывал его вывод в программа без сбоев, когда C # пытается загрузить его.

Я выделил процесс только для сбоя, когда я перенаправляю стандартный вывод или стандартную ошибку. Установка UseShellExecute в false, похоже, не влияет на это. Командная строка аналогичным образом закрывается, когда я пытаюсь загрузить ее таким образом, так что она не кажется странной для программы.

Я также пытался обойти это, используя FileSystemWatcher и читая логи, что программа может быть настроена на вывод этих данных, и я прочитал их, но когда я попробовал это, вывод, казалось, не сбрасывался на файл с достаточно хорошей скоростью.

Добавление глагола "runas" в startInfo, похоже, также не влияет на него, поскольку этот процесс уже требует запуска приложения в режиме администратора.

Process p = new Process();
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = filename;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
p.StartInfo = startInfo;

if(case1){
    p.StartInfo.Arguments = args;
    p.Start();
}

Ожидаемый результат, который происходит в моей исходной среде разработки для Windows 10, заключается в том, что процесс запустится

Фактический результат в Windows 7 заключается в том, что программа зависает при запуске, и появляется окно «Это приложение не отвечает».

EventViewer, похоже, считает, что проблема в msvcr120.dll, но тот факт, что это произошло на 3 отдельных компьютерах с Windows 7, указывает на то, что это, вероятно, что-то еще.

1 Ответ

0 голосов
/ 08 июня 2019

Возможно, вы перенаправляете вывод, но не читаете его. Дочерний процесс зависнет, когда заполнит свой выходной буфер.Убедитесь, что вы читаете это в коде C #.Примерно так:

        using (Process p = new Process())
        {
            p.StartInfo.UseShellExecute = false;                
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.RedirectStandardError = true;
            p.OutputDataReceived += (sender, args) => Debug.WriteLine("STDOUT: " + args.Data);
            p.ErrorDataReceived += (sender, args) => Debug.WriteLine("STDERR:" + args.Data);
            p.StartInfo.FileName = exePath;
            p.StartInfo.Arguments = parameters;
            p.Start();
            p.BeginOutputReadLine();
            p.BeginErrorReadLine();

            p.WaitForExit(30 * 1000);

            if (!p.HasExited)
            {
                Debug.WriteLine("Killing process");
                p.Kill();
            }

        }

По крайней мере, возможно, дочерний исполняемый файл записывает ошибку в свой stderr, и в этом случае проблема будет отображаться в выходных данных отладки.

...