RedirectStandardOutput崩溃进程

时间:2019-06-07 20:20:27

标签: c# windows-7 redirectstandardoutput

尝试使用C#进程以admin模式加载第三方应用程序并读取其输出。但是,当我尝试在该进程上使用RedirectStandardOutput时,在Windows 7 PC上启动后,它崩溃了几秒钟。我能够使其在Windows 10上正常工作,但我们也需要它在Windows 7上正常工作。我希望有一种方法能够使该程序正常运行,并能将其输出读取到Windows 10中。 C#尝试加载时不会崩溃的程序。

我将进程隔离为仅在重定向标准输出或标准错误时崩溃。将UseShellExecute设置为false似乎不会对其产生影响。类似地,当我尝试以这种方式加载命令提示符时,命令提示符也会关闭,因此它似乎并不是该程序的怪癖。

我也尝试过使用FileSystemWatcher来解决该问题,并读取可以将该程序设置为输出到这些日志的日志,并读取它们,但是当我尝试这样做时,输出似乎并没有刷新到文件的速度足够好。

在startInfo中添加“ runas”动词似乎也没有影响,因为此过程已经要求应用程序以管理员模式启动。

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上的实际结果是该程序在启动时冻结,并弹出Windows“此应用程序无响应”消息。

EventViewer似乎认为问题是msvcr120.dll引起的,但实际上这是在3台单独的Windows 7 PC上发生的,这表明可能还有其他原因。

1 个答案:

答案 0 :(得分:0)

可能是您正在重定向输出,但未读入。子进程在填充其输出缓冲区时将挂起。确保您正在使用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,在这种情况下,问题将显示在Debug输出中。