2016-07-08 2 views
0

Я разрабатываю простой компилятор, и заключительный этап после генерации кода IL заключается в его компиляции с помощью утилиты ilasm, в которой происходит сбой.Сбой процесса Process.Start

Вот полный код метода (слегка модифицирован для 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();), и что интересно, что исключение не выбрасывается. Или, другими словами, код просто падает.

+0

какая версия моно вы используете? – knocte

+0

@knocte, я думаю, что это одна из последних версий, вот точный возврат из 'mono -version':' Mono JIT-компилятор версии 4.2.4 (tarball Fri Jun 10 10:12:47 UTC 2016) ' –

+0

что ОПЕРАЦИОННЫЕ СИСТЕМЫ? как вы установили эту версию моно? – knocte

ответ

1

Вы не можете перенаправить ошибки и выход, если вы собираетесь установить

UseShellExecute = true; 

С Microsoft:

Вы должны установить UseShellExecute ложь, если вы хотите установить RedirectStandardError к истине. В противном случае чтение из потока StandardError генерирует исключение.

UseShellExecute Property

RedirectStandardError Property

Смежные вопросы