Wie kann ich eine mit Process.Start gestartete Konsolen-App sauber herunterfahren?
Das sieht nach einer unmöglichen Aufgabe aus. Ich habe absolut nichts gefunden, was funktioniert. Die Frage ist, wie eine mit Process.Start gestartete Konsolenanwendung, die ohne Konsolenfenster und ohne Shell-Ausführung gestartet wurde, sauber geschlossen werden kann: (ProcessStartInfo.CreateNoWindow = true; ProcessStartInfo.UseShellExecute = false;
).
Es wird vorausgesetzt, dass die gestartete Anwendung "sauber" heruntergefahren wird, wenn sie ein Ctrl-C- oder Ctrl-Break-Signal empfängt, aber es scheint keine Möglichkeit zu geben, ein funktionierendes Signal zu senden (insbesondere GenerateConsoleCtrlEvent).
Process.Kill funktioniert nicht. Es hinterlässt beschädigte Dateien aufgrund eines abrupten Abbruchs des Prozesses.Process.CloseMainWindow funktioniert nicht. In diesem Fall gibt es kein Hauptfenster, daher gibt die Funktion false zurück und führt nichts aus.Das Aufrufen von EnumThreadWindows für alle Threads für den Prozess und das Senden eines WM_CLOSE an jedes Fenster hat keine Auswirkungen, und es gibt sowieso keine Thread-Fenster.GenerateConsoleCtrlEvent funktioniert nicht. Dies ist nur für Prozesse in derselben Gruppe nützlich (über die Sie in .NET keine Kontrolle haben), mit dem unerwünschten Nebeneffekt, dass der aufrufende Prozess trotzdem geschlossen wird. Mit dieser Funktion können Sie keine Prozess-ID angeben.Wer Code bereitstellen kann, der ein mit den obigen Parametern gestartetes "Process" -Objekt akzeptiert, wodurch der gestartete Prozess sauber heruntergefahren wird, ohne den aufrufenden Prozess zu beeinflussen, wird als Antwort markiert. Verwenden Sie 7z.exe (7-zip-Archivierungsprogramm) als Beispiel für eine Konsolenanwendung, die mit dem Komprimieren einer großen Datei beginnt und eine beschädigte, unfertige Datei zurücklässt, wenn sie nicht ordnungsgemäß beendet wird.
Bis jemand ein Funktionsbeispiel oder einen Code bereitstellt, der zu einem Funktionsbeispiel führt, bleibt diese Frage unbeantwortet. Ich habe Dutzende von Leuten gesehen, die diese Frage gestellt haben und Dutzende von Antworten online, und keiner von ihnen funktioniert. .NET scheint keine Unterstützung für das ordnungsgemäße Schließen einer Konsolenanwendung aufgrund ihrer Prozess-ID zu bieten, was seltsam ist, wenn man bedenkt, dass sie mit einem .NET-Prozessobjekt gestartet wurde. Ein Teil des Problems ist die Unfähigkeit, einen Prozess in einer neuen Prozessgruppe zu erstellen, wodurch die Verwendung von GenerateConsoleCtrlEvent unbrauchbar wird. Hier muss es eine Lösung geben.