Wenn man einen Prozess aus einer Applikation heraus startet möchte man unter Umständen nach Beendigung des "Slave" Programmes wissen, ob der Prozess erfolgreich beendet wurde, bzw. ob es Fehler gegeben hat.
Jeder Prozess gibt an seinen Host (das ist üblicherweise das Betriebssystem, kann aber auch eine andere Applikation sein) einen Exit Code zurück. Der Exit Code ist 0 bei erfolgreichem Beenden, oder größer 0 im Fehlerfall. Über den Wert des Exit Codes kann bestimmt werden welcher Fehler eingetreten ist.
Zum Starten eines Prozesses aus einem anderen heraus muss zuerst ein ProcessStartInfo Objekt angelegt werden, das Informationen zu dem zu startenden Prozess enthält. Nach dem Starten und Beenden des Slave Prozesses steht der Exit Code zur Verfügung und kann ausgelesen werden.
ProcessStartInfo processInfo = new System.Diagnostics.ProcessStartInfo(@"..\..\..\SlaveProgram\bin\Release\SlaveProgram.exe");
// Ein neuer Prozess wird gestartet
Process p = Process.Start(processInfo);
// Der Exit Code kann natürlich erst ausgelesen werden, wenn die aufgerufene
// Applikation beendet wurde.
p.WaitForExit();
// Auslesen des Exit Codes
switch (p.ExitCode)
{
case 0:
Console.WriteLine("Das Programm wurde ordnungsgemäß beendet. (Error Code 0)");
break;
default:
Console.WriteLine("Das Programm wurde nicht ordnungsgemäß beendet. (Error Code {0})", p.ExitCode);
break;
}
In der Slave Applikation gibt es zwei Wege den Exit Code zu setzen, als return value der Main Methode, oder über Environment.Exit(int ExitCode).
Return Value:
Ist die Main Methode also int definiert, also
static int Main(string[] args)
{ ... }
so kann (und muss) zum Beenden der Methode ein return value übergeben werden:
return i;
Es kann allerdings darauf verzichtet werden, die Signatur der Main Methode zu ändern und im Fehlerfall wird die Applikation über
Environment.Exit(i);
geschlossen. Dies hat den Vorteil, dass nur im Fehlerfall ein Exit Code ungleich 0 übergeben werden muss und die Anwendung ansonsten automatisch 0 zurück gibt beim Beenden.
Das Beispielprojekt ist hier hochgeladen:
http://cid-fd4d63530af59c99.skydrive.live.com/self.aspx/.Public/ExitCode.zip