これらの質問に答える最善の方法は、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.ExitInternalFormClosingEventArgs.Cancelに設定して閉じることを中止しようとするフォームのチェックを含め、開いているフォームを閉じますTrue。キャンセルしようとするフォームがない場合、フォームは閉じられ、 を使用してThreadContext.ExitApplicationすべてThreadConnextsがクリーンアップされます (DisposedまたはそれらApplicationContext.ExitThreadが呼び出されます)。
NB NoThread.Abortが呼び出されるため、スレッドは明示的に終了しません。また、は通常の「イベント」をWindows.Forms ModalApplicationContext呼び出すことさえしません。ThreadExitApplicationContext
( でサポートされている 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しないようなものを呼び出します。FinallyDisposeFinalize
ドキュメントは、現在正常に動作していますが、コンソールアプリケーション用ではないことを暗示していることに注意してくださいApplication.Restart(ただし、すぐに終了しないことを除きます。これは、によって暗示されていませんApplication.Exit)。