Wie Sie einen Prozess erstellen, der überlebt seine Eltern
Ich versuche zu starten, einen externen updater Anwendung für eine Plattform, die ich entwickelt habe. Der Grund, warum ich möchte, um zu starten dieser updater ist denn meine Konfiguration Dienstprogramm, das die Griffe updates und Lizenz-Konfiguration für die Plattform freigegeben hat Abhängigkeiten zu anderen assemblies in den Ordner wo das update bereitgestellt wird. Also, ich kann zwar benennen Sie die Konfigurations-utility und überschreiben Sie ihn, wenn Sie den update kann ich nicht umbenennen oder überschreiben der DLLs, es hängt davon ab. Daher werden die externen updater.
Bin ich den Umgang mit allen dem update sammeln Logik in der Konfiguration-Dienstprogramm, dann den Versuch zu starten den updater zu handhaben die eigentliche Datei kopieren/überschreiben-Vorgänge. Offensichtlich, weil die Datei in Benutzung Probleme, ich brauche das Konfigurationsdienstprogramm zu verlassen direkt nach dem updater beginnt.
Das problem das ich habe ist, dass ich mit der standard-Prozess.Start-Methode starten Sie den updater, und sobald Sie das Konfigurationsprogramm beendet wird, hat der updater-Prozess getötet wird auch.
Gibt es irgendeine Möglichkeit, dass ich einen Prozess erstellen, der überlebt seine Eltern, oder starten Sie eine externe Anwendung ausgeführt werden können, ist darüber hinaus das Programm, das Sie ins Leben gerufen?
EDIT:
Scheinbar, in meinen updater, ich habe mich verrechnet die Anzahl der Kommandozeilen-Argumente, die übergeben werden. Weil dieses, der updater würde sofort aussteigen. Ich interpretiert dies bedeuten, dass die launcher-Anwendung war das töten der "child" - Prozess, wenn in der Tat, er war es nicht.
Antworten richtig sind.
- Ich weiß, es ist eine Art rückwärts-denken, aber könnten Sie einen Prozess haben, das ist ganze Arbeit zu verwalten, starten Sie die Konfiguration-Dienstprogramm und Ihre Anwendung? So könnte man aktualisieren, die Anwendung und die Konfiguration-Dienstprogramm (falls erforderlich) separat und würde nicht haben, um sorgen über die Kind-Prozesse sterben, die mit Ihren Eltern (da die Eltern immer ausgeführt werden).
- Ich hatte einen Fehler in meinem updater-code, gezwungen, es zu verlassen Sie unverzüglich. Ich nahm an, dies wurde von der "Start" - Prozess schließen. Ich aktualisiert meine Nachricht entsprechend. Gibt es eine Möglichkeit zu geben, selbst negative rep als Selbstbestrafung für so einen lächerlichen Fehler???
- Können wir davon ausgehen, dass Sie mit C# / .net / Win32 und nicht-C# / Mono / *nix? Ich weiß nicht, ob Prozess funktioniert genauso wie in allen Umgebungen.
- Ich habe aktualisiert die tags, das deutlich zu machen, guter Punkt!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es scheint, dass das problem, das Sie zu sehen sind, hat einen anderen Grund, weil die
Process
Klasse wird nicht töten alle Prozesse, die gestartet mitProcess.Start
wenn Ihre Anwendung beendet.Sehen diesem einfachen Beispiel-Programm, den Taschenrechner offen bleiben:
Es gibt keinen Grund, warum der Prozess begann mit
Process.Start
sollte automatisch sterben, wenn der launcher beendet wird. Meine Vermutung ist, dass du tust etwas seltsam in der updater.Ich geschrieben habe ein updater tut genau das, diese Art der Sache vor, und es ist schon in Ordnung.
Beispiel:
Launcher.cs:
Launchee.cs:
Kompilieren Sie beide, separat, und führen Sie Launcher.exe. Die "launchee" Prozess definitiv länger als der launcher.
Nur ein Gedanke von meiner nebligen Erinnerung, aber ich glaube mich zu erinnern, dass eine Diskussion eine Weile zurück, dass, wenn der Prozess.Start-Methode wird aufgerufen, aus Form, dass der erzeugte Prozess hat irgendeine Art von Abhängigkeit (nicht sicher, was, warum oder wie, der Speicher ist ein bisschen nebelig).
Damit zu beschäftigen, ein flag gesetzt wurde, das war eigentlich der Aufruf aus der Main () - Methode des application-nach der main-form/app verlassen und, wenn der Prozess gestartet wurde von der Main () - Methode, die eveything hat einfach geklappt.
Nur ein Gedanke, wie ich schon sagte, ist dies rein aus dem Gedächtnis, aber einige der Beispiele, die hier gepostet sind alle aufgerufen wird, von der Main () - Methode einer Konsolenanwendung schien zu joggen etwas.
Hoffe, dass alles gut geht für Sie.