2013-06-19 15 views
6

この質問は、アプリケーションを再起動する方法ではありません。私は既にMutexとセカンダリースターターアプリケーションを使用してこれを達成しています。私は、Application.Restartを使用していくつかの問題に直面した後、それに頼る必要がありました。.NETでApplication.Restartはどのように機能しますか?

いずれにしても、ILに慣れていないと、私は誰かがApplication.Restartが最初にどのように動作するか説明できるかどうか疑問に思っていました。これはランタイムへの呼び出しですが、ランタイムは正確に何をしていますか?既存のインスタンスをどのように閉じて、新しいインスタンスをいつ起動するのかをどのように知っていますか?

答えて

8

は... 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の質問を参照してください。

+0

バー、あなたの答えは私よりもはるかに優れています。私はちょうど私のものを削除することもできます:(あなたに+1してください! –

+0

@ Christian.K:誰が 'Process.Start(Application.ExecutablePath) ? – joe

+0

@joe 'Application.Restart()'を呼び出したスレッドは、関数が返す前に最後に行うことです。 –

関連する問題