6

この質問は、アプリケーションを再起動する方法に関するものではありません。Mutex とセカンダリ スターター アプリケーションを使用して、既にそれを達成しています。Application.Restart を使用していくつかの問題に直面した後、私はそれに頼らなければなりませんでした。

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

4

1 に答える 1

8

... IL に堪能でない ...

逆コンパイラ(Reflector、dotPeek)の使用を検討したことがありますか? または、.NET フレームワークのリファレンス ソースコードの使用を検討したことがありますか?

ともかく。

カジュアルな外観では、次のことを行います。

  • 以下のすべてのケースで、現在のインスタンスは を使用して終了されますApplication.ExitInternal()。これが publicApplication.Exit()メソッドの要点であり、いくつかのセキュリティ チェック/アサートを省略しています。

  • を判別できるかどうかを確認しますAssembly.GetEntryAssembly()。それがnull呼び出しである場合、 はApplication.Restart()アンマネージ コードから実行された可能性が高く、操作NotSupportedExceptionは呼び出し元に a をスローします。

  • 現在のプロセスがieexec.exeであるかどうかを確認し、そうである場合はそれを使用してアプリケーションを再起動します (詳細については、こちらieexec.exeを参照してください)。実際には、これは の呼び出しでもありますが、コマンド ライン引数は によって収集されるのではなく(以下を参照)、アプリケーション ドメイン データを読み取ることによって収集されます。Process.Start()ieexec.exeEnvironment.GetCommandLineArgs()APP_LAUNCH_URL

  • アプリケーションがクリック ワンス アプリケーション ( ApplicationDeployment.IsNetworkDeployed) であるかどうかを確認します。そうである場合は、CLR 内部ネイティブ コードを呼び出して、それを (再) 起動しますCorLauncApplication。CLR のネイティブ部分に多少似ている唯一の公開ソース コードは、.NET 2.0 フレームワークに基づいており、部分的に不完全な共有ソース CLI (sscli) です。その関数 ( clr\src\vm\hosting.cpp) の定義が含まれていますが、これは単なるスタブです。最後に、何らかの手段を使用してプロセスを再開します (例: Win32 のCreateProcessAPI)。

  • それ以外の場合: アプリケーションは「通常の」.NET アプリケーションです。Environment.GetCommandLineArgs()元のコマンドラインを再作成するためにProcess.Start(Application.ExecutablePath)使用され、アプリケーションを再起動するために使用されます。

-メカニズムを使用しApplication.Exitて現在のインスタンスを終了しようとすることが、おそらく信頼できない理由です。送信終了イベントをキャンセルするフォームは、それを中断できます。このSOの質問も参照してください。

于 2013-06-19T04:44:26.933 に答える