は... ILと流暢されていない、...
あなたは、より良い、.NETフレームワークのreference sourceコードをdecompiler(リフレクター、dotPeek)を使用して考えられたりしましたか?
とにかく。すべて以下の例で
、現在のインスタンスがApplication.ExitInternal()
を使用して終了されます。それは、次のないカジュアルルックで
。それは公共の要点ですApplication.Exit()
メソッド、いくつかのセキュリティチェック/アサートを逃れることです。
Assembly.GetEntryAssembly()
を判断できるかどうかを確認してください。それがnull
の場合、Application.Restart()
のコールはアンマネージコードから行われた可能性が最も高く、オペレータはNotSupportedException
を呼び出し元に送信します。
現在のプロセスがieexec.exe
かどうかを確認してください。アプリケーションを再起動する場合は、ieexec.exe
の詳細についてはhereを参照してください。実際にはieexec.exe
を呼び出すのはですが、コマンドラインの引数はEnvironment.GetCommandLineArgs()
(下記参照)で集められませんが、APP_LAUNCH_URL
アプリケーションドメインのデータを読むことによって得られます。
アプリケーションがクリックワンスアプリケーション(ApplicationDeployment.IsNetworkDeployed
)かどうかを確認するには、CLR内部ネイティブコードを呼び出して、それを起動します(CorLauncApplication
)。 CLRのネイティブ部分に幾分似ている公開されている唯一のソースコードは、.NET 2.0フレームワークに基づいており部分的に不完全である共有ソースCLI(sscli)です。その関数の定義が含まれています(clr\src\vm\hosting.cpp
)が、スタブにすぎません。最終的には、プロセスを再開するための手段(Win32のCreateProcess
APIなど)を使用します。
その他:アプリケーションは「通常の」.NETアプリケーションです。 Environment.GetCommandLineArgs()
を使用して元のコマンドラインを再作成し、Process.Start(Application.ExecutablePath)
を使用してアプリケーションを再起動します。
Application.Exit
-mechanismの使用は、現在のインスタンスは、おそらくあなたはそれが信頼できない見つける理由で終了しようとします。送信終了イベントをキャンセルするフォームは、それを中断する可能性があります。またthisのSOの質問を参照してください。
バー、あなたの答えは私よりもはるかに優れています。私はちょうど私のものを削除することもできます:(あなたに+1してください! –
@ Christian.K:誰が 'Process.Start(Application.ExecutablePath) ? – joe
@joe 'Application.Restart()'を呼び出したスレッドは、関数が返す前に最後に行うことです。 –