Laden...

.NET 4.8: WinForm, Console App starten und Rückgabe abfangen

Erstellt von schuppsl vor einem Jahr Letzter Beitrag vor einem Jahr 589 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor einem Jahr
.NET 4.8: WinForm, Console App starten und Rückgabe abfangen

Hallo zusammen,

in meiner .NET 4.8 WinForm Application möchte ich ein Konsolenprogramm starten.
Dies ist ein "externes" Programm und läuft dann außerhalb der WinForms Anwendung selbstständig weiter.

Anschließen starte ich ein zweites Konsolenprogramm, welches den Status des ersten als XML String zurückgibt.
Dies ist ebenfalls ein "Externes" Programm, das unabhängig läuft.
Die Vorgehensweise ist si festgelegt.

Das Ergebnis, also den XML String sollte ich nun im WindowsForms Programm abfangen, um den Status herauszufiltern.
Das Starten der Programme ist kein Problem, aber wie kann ich die Ausgabe abfangen?

Ich habe verschiedene Wege ausprobiert, aber keiner funktioniert richtig:



            System.Diagnostics.Process process = new System.Diagnostics.Process();
            process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            process.StartInfo.FileName = "cmd.exe";
            process.StartInfo.Arguments = $"/C meinTollerBefehl \"D:\\Programme\\xxx\\{lblResult.Text}\"";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.CreateNoWindow = true;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardInput = true;
            process.Start();
            process.OutputDataReceived += Process_OutputDataReceived;
            process.ErrorDataReceived += Process_ErrorDataReceived;

            process.WaitForExit();

            string q = "";
            while (!process.HasExited)
            {
                q += process.StandardOutput.ReadToEnd();
            }

            MessageBox.Show(q);

Irgendwie auch logisch, da die Konsolenapplication nicht im Kontext der WindowsForms Anwendung läuft, sondern eigenständig.(Als Admin)

Gibt es hierfür eine Lösung?
Vielen Dank im Voraus!

T
2.219 Beiträge seit 2008
vor einem Jahr

Eigentlich ist in der Doku das passende Beispiel dabei.
Du brauchst auch keine eigene while schleife, dafür kannst du mit WaitForExit auf das Ende des Prozess warten.
Ansonsten bekommst du über ReadToEnd auch alle Zeilen, dies musst du eigentlich nicht mehrfach aufrufen!

Link:
Process.StandardOutput Eigenschaft (System.Diagnostics)

Nachtrag:
Ebenfalls sollte dieser Part auch asynchron laufen, sonst blockiert deine Winforms Anwendung bzw. die UI.

FAQ:
[FAQ] Warum blockiert mein GUI?

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor einem Jahr

Vielen Dank, funktioniert!