Process.Start 无异常崩溃
Process.Start crashes without an exception
我正在开发一个简单的编译器,生成 IL 代码后的最后阶段是使用 ilasm
实用程序编译它,这就是崩溃发生的地方。
下面是该方法的完整代码(针对 Stack 稍作修改):
public static string ExecuteIL(string filename)
{
var ilasmp = new System.Diagnostics.Process ();
ilasmp.StartInfo.FileName = "ilasm";
ilasmp.StartInfo.Arguments = filename;
//Crash does not happen here:
ilasmp.Start ();
ilasmp.WaitForExit ();
var p = new System.Diagnostics.Process ();
p.StartInfo.FileName = "/usr/bin/time";
p.StartInfo.Arguments = "mono " + filename.Replace(".il", ".exe");
p.StartInfo.UseShellExecute = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
try{
//Crash happens HERE, but for some reason the exception does not get thrown
p.Start ();
}
catch{
throw new Exception ();
}
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit ();
return output;
}
只是说清楚:当我第一次调用 Process.Start
(ilasmp.Start ();
) 时不会发生崩溃,但由于某种原因后来发生了 (p.Start ();
) ,
有趣的是不会抛出异常。
或者换句话说,代码只是崩溃了。
如果要设置
,则无法重定向错误和输出
UseShellExecute = true;
来自微软:
You must set UseShellExecute to false if you want to set RedirectStandardError to true. Otherwise, reading from the StandardError stream throws an exception.
我正在开发一个简单的编译器,生成 IL 代码后的最后阶段是使用 ilasm
实用程序编译它,这就是崩溃发生的地方。
下面是该方法的完整代码(针对 Stack 稍作修改):
public static string ExecuteIL(string filename)
{
var ilasmp = new System.Diagnostics.Process ();
ilasmp.StartInfo.FileName = "ilasm";
ilasmp.StartInfo.Arguments = filename;
//Crash does not happen here:
ilasmp.Start ();
ilasmp.WaitForExit ();
var p = new System.Diagnostics.Process ();
p.StartInfo.FileName = "/usr/bin/time";
p.StartInfo.Arguments = "mono " + filename.Replace(".il", ".exe");
p.StartInfo.UseShellExecute = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
try{
//Crash happens HERE, but for some reason the exception does not get thrown
p.Start ();
}
catch{
throw new Exception ();
}
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit ();
return output;
}
只是说清楚:当我第一次调用 Process.Start
(ilasmp.Start ();
) 时不会发生崩溃,但由于某种原因后来发生了 (p.Start ();
) ,
有趣的是不会抛出异常。
或者换句话说,代码只是崩溃了。
如果要设置
,则无法重定向错误和输出UseShellExecute = true;
来自微软:
You must set UseShellExecute to false if you want to set RedirectStandardError to true. Otherwise, reading from the StandardError stream throws an exception.