我在Process.Start()
时遇到了困难
这是代码:
static void Main(string[] args)
{
string fileName = @"C:\path_to_project\bin\Debug\helloworld.exe";
ProcessStartInfo info = new ProcessStartInfo(fileName);
info.UseShellExecute = false;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.CreateNoWindow = true;
Process process = Process.Start(info);
string error = process.StandardError.ReadToEnd();
string returnvalue = process.StandardOutput.ReadToEnd();
process.WaitForExit();
Console.ReadLine();
}
代码应该只调用helloworld控制台应用程序,它只有一行Console.WriteLine("Hello World")
,没什么特别的。
当我调试此代码时,我到达Process process = Process.Start(info);
然后当我点击Step(F10)时没有任何反应。我的应用程序挂起,我开始的过程就在那里,但它没有完成。我需要杀死所有人。
这段代码适用于我的同事的机器,但在我的机器上,这个过程只是挂起,我唯一能做的就是杀死这个过程。
我还注意到,当我在资源管理器中双击任何控制台应用程序时,光标会将状态更改为忙,并且在我杀死explorer.exe之前永远不会更改。
可能是某些安全问题还是恶意软件?
答案 0 :(得分:2)
Avast Antivirus拦截了Process.Start(),可能它试图对我尝试启动的应用程序进行沙盒化,以便它挂起。
我暂时禁用了盾牌,现在可以了。
谢谢大家的努力。
答案 1 :(得分:0)
所以实际上你的代码看起来很好。它通过一个简单的“Hello World!”对我有用。控制台应用程序。
但是,我记得前一段时间我们遇到过这样的问题,我们尝试从输出中获取的进程挂起process.WaitForExit()
。
不幸的是,我不记得这是否与你在这里遇到的问题完全相同。但我建议你尝试另外一种可能性:
static void Main(string[] args)
{
string fileName = @"C:\path_to_project\bin\Debug\helloworld.exe";
ProcessStartInfo info = new ProcessStartInfo(fileName);
info.UseShellExecute = false;
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.CreateNoWindow = true;
StringBuilder outputBuilder = new StringBuilder();
StringBuilder errorBuilder = new StringBuilder();
Process process = new Process {StartInfo = info};
process.OutputDataReceived += (sender, e) => outputBuilder.Append(e.Data);
process.ErrorDataReceived += (sender, e) => errorBuilder.Append(e.Data);
process.Start();
process.BeginErrorReadLine(); // do this after process.Start()
process.BeginOutputReadLine();
process.WaitForExit();
string error = errorBuilder.ToString();
string returnvalue = outputBuilder.ToString();
Console.WriteLine("Returned: {0}", returnvalue);
Console.WriteLine("Error: {0}", error);
Console.ReadLine();
}
对不起,我无法解释为什么你的代码挂起了(正如我说它对我有用)。但也许这种变化可行。