これらの質問に答える最善の方法は、Reflector (または Microsoft の無料のデバッグ コードが利用可能な場合) を使用してコード自体を調べることです。
Reflector を使用すると、(.NET Framework 4.0 では)System.Windows.Forms.Application.Restart
次の 4 種類のアプリケーションが検索されることがわかります。
Assembly.GetEntryAssembly
である場合Nothing
の最初のチェックNotSupportedException
。
- これ
Process.GetCurrentProcess.MainModule.FileName
はieexec.exe
、現在の .NET Framework と同じフォルダー (具体的には、モジュール定義Object
があるフォルダー) にあります。
ApplicationDeployment.IsNetworkDeployed
ですTrue
。と
- 一般的な場合。
サポートされている 3 つのケースはすべて、プロセスを再起動する方法を決定し、プロセスを呼び出しApplication.ExitInternal
て再起動します。
Application.ExitInternal
FormClosingEventArgs.Cancel
に設定して閉じることを中止しようとするフォームのチェックを含め、開いているフォームを閉じますTrue
。キャンセルしようとするフォームがない場合、フォームは閉じられ、 を使用してThreadContext.ExitApplication
すべてThreadConnexts
がクリーンアップされます (Disposed
またはそれらApplicationContext.ExitThread
が呼び出されます)。
NB NoThread.Abort
が呼び出されるため、スレッドは明示的に終了しません。また、は通常の「イベント」をWindows.Forms
ModalApplicationContext
呼び出すことさえしません。ThreadExit
ApplicationContext
( でサポートされている 3 つのケースはすべての結果をApplication.Restart
無視Application.ExitInternal
することに注意してください。そのため、フォームが中止を試みた場合、他のフォームは閉じる機会がなく、ThreadContext はクリーンアップされません!)
あなたの質問にとって重要なのは、現在のスレッドまたはアプリケーション全体を実際に終了しようとしないことです(開いているフォームとスレッドコンテキストを閉じることを除く)。
ただし、MsgBox("restarting")
実行するまでに、新しいアプリケーションが開始されています。
を呼び出した後、アプリケーションを手動で終了する必要がありますApplication.Restart
。「フォーム内で実行する」場合(これをテストしたコードは表示されません)、フォームが閉じられ、それが現在のアプリケーションの終了と見なされるか、または余分なものWindows.Forms
(またはVB ) セットアップとは、発生するクリーンアップが実行されたときにスローされる「イベント」の 1 つによってアプリケーションが終了されることを意味します。
MsgBox
つまり、テストする前に、このコードがClick
フォームのイベントである場合でも、最初にフォームが消え、同時にアプリケーションが再起動することを期待していました。
テストしたところ、MsgBox
それに対応するビープ音が聞こえ、コメントアウトするとビープ音は発生しません。そのため、メッセージ ボックスが開いている必要がある場合でも、何らかの理由でアプリケーションが終了し、MsgBox
を のFinally
外側に配置してもApplication.Run
、 に表示されませんRestart
。MsgBox
( の後に呼び出すと、同様の効果が見られることに注意してくださいApplication.Exit
。)
Windows.Forms
したがって、 (または VB)によってセットアップされたものは、実際にEnvironment.Exit
は Win32Api を呼び出し、 orを考慮したり呼び出したりExitProcess
しないようなものを呼び出します。Finally
Dispose
Finalize
ドキュメントは、現在正常に動作していますが、コンソールアプリケーション用ではないことを暗示していることに注意してくださいApplication.Restart
(ただし、すぐに終了しないことを除きます。これは、によって暗示されていませんApplication.Exit
)。