Laufende Anwendung aus dem Programmcode heraus neu starten

Diese Woche musste ich eine Lösung finden, eine mit „Console.ReadLine()“ wartende Konsolenanwendung aus einem Thread heraus neu starten zu können. Da diese Funktionalität alles andere als trivial ist, dachte ich mir, dass ein Artikel darüber für den einen oder anderen sehr praktisch sein könnte.

Senden von virtuellen Tastendrücken an die Konsolenanwendung

Wenn man aus einem Thread heraus die wartende Konsolenanwendung ansprechen will, geht das nur indem man ihr vorgaukelt, dass der Benutzer eine Tastenkombination eingegeben hat. Ich habe mich hier für die Kombination „r“ + Eingabe entschieden. Den Sinn bei „r“ für einen Neustart (englisch „restart“) muss ich hier nicht weiter erläutern. Um diese virtuellen Keypresses benutzen zu können, muss man sich aus der user23.dll die Funktion „PostMessage“ importieren.

Folgende Funktion ermöglicht das Senden von r + Eingabe an die aktuell laufende Konsolenanwendung.

 Auswerten der Eingabe in der wartenden Konsolenanwendung

Die wartende Konsolenanwendung muss dahingehend angepasst werden, dass die Rückgabe der Funktion „Console.ReadLine()“ ausgewertet wird:

Anwendung neu starten

Die Funktion „RestartApplication()“ führt dann die eigentliche Neustart-Logik aus. Diese wurde von mir wie folgt implementiert:

Zu beachten ist hier: Durch diese Funktion wird ein eigenständiger Prozess angelegt. Der neue Prozess steht nicht in einer Prozessstruktur verbunden zu dem aktuell laufenden Prozess. Darum wird der aktuell laufende Prozess auch ohne Probleme beendet, wenn der neue Prozess gestartet wurde.

Ich hoffe, ich konnte mit dem Artikel dem einen oder anderen bei der Problemlösung helfen. Kommentare, Anregungen und Kritik sind natürlich gern gesehen!