2013-06-19 6 views
6

Bei dieser Frage geht es nicht darum, wie eine Anwendung neu gestartet wird. Das erreiche ich bereits mit einem Mutex und einer sekundären Starteranwendung. Ich musste darauf zurückgreifen, nachdem ich einige Probleme mit Application.Restart hatte.Wie funktioniert Application.Restart in .NET?

In jedem Fall, nicht fließend mit IL, ich frage mich, ob jemand erklären könnte, wie Application.Restart in erster Linie funktioniert. Es ist ein Aufruf an die Runtime, aber was genau macht die Runtime? Wie schließt es die vorhandene Instanz und wie weiß sie, wann sie eine neue starten soll?

Antwort

8

... nicht mit IL ist fließend, ...

Haben Sie darüber nachgedacht, mit einem decompiler (Reflektor, dotPeek) oder, noch besser, der reference source Code des .NET-Framework?

Wie auch immer.

Bei einem lässigen Look geschieht Folgendes:

  • In allen folgenden Fällen wird die aktuelle Instanz mit Application.ExitInternal() beendet. Das ist der Kern der öffentlichen Application.Exit() Methode, die einige Sicherheitsprüfungen aussetzt.

  • Überprüfen Sie, ob es die Assembly.GetEntryAssembly() ermitteln kann. Wenn das null der Anruf ist, wurde die Application.Restart() höchstwahrscheinlich aus nicht verwaltetem Code ausgeführt, und die Operation wirft eine NotSupportedException an den Aufrufer.

  • Prüfen Sie, ob der aktuelle Prozess ieexec.exe ist, wenn so es verwenden, um die Anwendung neu zu starten (für weitere Informationen über ieexec.exe sehen here). Eigentlich ist das auch ein Aufruf an ieexec.exe, aber die Befehlszeilenargumente werden nicht von Environment.GetCommandLineArgs() (siehe unten) gesammelt, sondern durch Lesen der APP_LAUNCH_URL Anwendungsdomänendaten.

  • Sehen Sie, wenn die Anwendung eine Click-Once-Anwendung ist (ApplicationDeployment.IsNetworkDeployed), wenn ja, rufen Sie einen internen CLR-nativen Code zum (Neu-) Starten: CorLauncApplication. Der einzige öffentlich verfügbare Quellcode, der den nativen Teilen der CLR etwas ähnelt, ist die gemeinsame Quellen-CLI (sscli), die auf dem .NET 2.0-Framework basiert und teilweise unvollständig ist. Es enthält eine Definition für diese Funktion (clr\src\vm\hosting.cpp), aber es ist nur ein Stub. Am Ende wird es einige Mittel verwenden, um den Prozess neu zu starten (z. B. Win32 CreateProcess API).

  • Sonst: Die Anwendung ist eine "normale" .NET-Anwendung. Environment.GetCommandLineArgs() wird verwendet, um die ursprüngliche Befehlszeile neu zu erstellen und Process.Start(Application.ExecutablePath) wird verwendet, um die Anwendung neu zu starten.

Die Verwendung des Application.Exit -Mechanismus zu versuchen, die aktuelle Instanz ist wahrscheinlich der Grund, warum Sie es unzuverlässig finden zu beenden. Formulare, die das sendende Closing-Ereignis abbrechen, können es unterbrechen. Siehe auch this SO Frage.

+0

Bah, Ihre Antwort ist so viel besser als meine, ich könnte auch nur meine löschen :(. +1 zu Ihnen gut, Herr! –

+0

@ Christian.K: Wer ruft die 'Process.Start (Application.ExecutablePath)' ? – joe

+0

@joe Der Thread namens 'Application.Restart()' ist das letzte, was die Funktion vor der Rückgabe tut. –