2016-07-08 14 views
0

Ich entwickle einen einfachen Compiler, und die letzte Stufe nach dem IL-Code wurde mit dem ilasm Dienstprogramm kompiliert, wo der Absturz stattfindet. HierProcess.Start stürzt ohne Ausnahme ab

ist der vollständige Code der Methode (leicht modifiziert für 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; 
} 

Nur um es klar: Der Absturz geschieht nicht, wenn ich Process.Start zum ersten Mal (ilasmp.Start();) nennen, aber Aus irgendeinem Grund passiert das später (p.Start();), und was interessant ist, ist, dass eine Ausnahme nicht geworfen wird. Oder mit anderen Worten, der Code stürzt einfach ab.

+0

, welche Version von Mono verwenden Sie? – knocte

+0

@knocte, ich denke, es ist eine der neuesten Versionen, hier ist die genaue Rückkehr von 'mono --version':' Mono JIT Compiler Version 4.2.4 (Tarball Fr Jun 10 10:12:47 UTC 2016) ' –

+0

was OS? Wie hast du diese Version von Mono installiert? – knocte

Antwort

1

Sie können keine Fehler und Ausgabe umleiten, wenn Sie

UseShellExecute = true; 

Von Microsoft zu setzen gehen:

Sie müssen UseShellExecute auf false gesetzt, wenn Sie RedirectStandardError auf true gesetzt werden sollen. Andernfalls wird beim Lesen aus dem Stream StandardError eine Ausnahme ausgelöst.

UseShellExecute Property

RedirectStandardError Property