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.

UseShellExecute Property

RedirectStandardError Property