尝试使用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上发生的,这表明可能还有其他原因。
答案 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输出中。