2 Stimmen

Alternative native Api für Process.Start

Ok, das ist kein Duplikat von " Alternative zu Process.Start() ", denn meine Frage ist hier eine andere.

Ich muss einen Prozess ausführen und warten, bis die Ausführung des Prozesses und erhalten die Ausgabe der Konsole.

Es gibt eine Möglichkeit, RedirectStandardOutput und RedirectStandardError auf true zu setzen, jedoch funktioniert dies nicht gut auf einigen Maschinen, (wo .NET SDK nicht installiert ist), nur .NET Runtime installiert ist, jetzt funktioniert es auf einigen Maschinen und funktioniert nicht auf einigen Maschinen, so dass wir nicht wissen, wo das Problem ist.

Ich habe folgenden Code,

        ProcessStartInfo info = new ProcessStartInfo("myapp.exe", cmd);
        info.CreateNoWindow = true;
        info.UseShellExecute = false;
        info.RedirectStandardError = true;
        info.RedirectStandardOutput = true;
        Process p =  Process.Start(info);
        p.WaitForExit();
        Trace.WriteLine(p.StandardOutput.ReadToEnd());
        Trace.WriteLine(p.StandardError.ReadToEnd());

Auf manchen Rechnern bleibt das Programm bei p.WaitForExit() ewig hängen, auf manchen Rechnern funktioniert es korrekt, das Verhalten ist so zufällig, dass es keinen Anhaltspunkt gibt.

Wenn ich nun eine wirklich gute Lösung für dieses Problem mit pinvoke finden kann, werde ich sehr glücklich sein.

myapp.exe ist nichts anderes als 10 Hallo-Welt-Anweisungen auf den Bildschirm zu schreiben.

1voto

Remus Rusanu Punkte 280155

Könnte es sein, dass Ihr Kindprozess wirklich ewig hängt, z.B. weil er auf eine Eingabe wartet oder einen Fehlerdialog anzeigt, der nicht sichtbar ist?

Die native API ist CreateProcess und die dazugehörige pInvoke .

0voto

Reed Copsey Punkte 536986

Die Verwendung eines separaten Workarounds durch den Aufruf von nativem Code wird das Problem nicht beheben. Die Prozess-API ist nur ein dünner Wrapper um den nativen Prozess-Funktionen - Wenn Sie sie direkt verwenden, wird Ihr Code nur noch unübersichtlicher und verursacht weitere Probleme.

Das Problem scheint in diesem Fall Ihre "myapp.exe" zu sein. Aus irgendeinem Grund wird diese Anwendung auf diesen Rechnern nicht beendet. Wenn Sie die Ursache herausfinden, werden Sie wahrscheinlich in der Lage sein, das Problem mit Process.Start zu beheben.

0voto

Akash Kava Punkte 37863

Ok, ich habe diese Antwort von irgendwoher...

    using System.Diagnostics;
    using System.Threading;

    ProcessStartInfo info = new ProcessStartInfo("myapp.exe", cmd); 
    info.CreateNoWindow = true; 
    info.UseShellExecute = false; 
    info.RedirectStandardError = true; 
    info.RedirectStandardOutput = true; 
    Process p =  new Process();
    p.StartInfo = info; 
    p.BeginOutputReadLine();
    p.BeginErrorReadLine();

    AutoResetEvent wait = new AutoResetEvent(false);

    p.Exited += (s,e)=>{
        wait.Set();
    }
    p.Start();
    wait.WaitOne();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X