簡體   English   中英

Application.Restart如何在.NET中運行?

[英]How does Application.Restart work in .NET?

此問題與如何重新啟動應用程序無關。 我已經通過使用Mutex和輔助啟動器應用程序實現了這一目標。 在使用Application.Restart遇到一些問題后,我不得不求助於此。

無論如何,我不熟悉IL,我想知道是否有人可以解釋Application.Restart的工作原理。 它是對運行時的調用,但運行時究竟做了什么? 它如何關閉現有實例以及它如何知道何時啟動新實例?

......不熟悉IL,......

您是否考慮過使用反編譯器 (Reflector,dotPeek),或者更好的是使用.NET框架的參考源代碼?

無論如何。

隨便看看它做了以下事情:

  • 在以下所有情況下,使用Application.ExitInternal()終止當前實例。 這是公共Application.Exit()方法的要點,忽略了一些安全檢查/斷言。

  • 看看它是否可以確定Assembly.GetEntryAssembly() 如果為null則調用Application.Restart()很可能是從非托管代碼完成的,並且操作會向調用者拋出NotSupportedException

  • 查看當前進程是否為ieexec.exe ,如果是,請使用它來重新啟動應用程序(有關ieexec.exe詳細信息,請參閱此處 )。 實際上,這也是對ieexec.exeProcess.Start()調用,但命令行參數不是由Environment.GetCommandLineArgs() (見下文)收集的,而是通過讀取APP_LAUNCH_URL應用程序域數據。

  • 查看應用程序是否為單擊一次應用程序( ApplicationDeployment.IsNetworkDeployed ),如果是,則調用CLR內部本機代碼以(重新)啟動: CorLauncApplication 唯一公開可用的源代碼有點類似於CLR的本機部分,是共享源CLI(sscli),它基於.NET 2.0框架,也部分不完整。 它包含該函數的定義( clr\\src\\vm\\hosting.cpp ),但它只是一個存根。 最后,它將使用一些方法來重新啟動進程(例如Win32的CreateProcess API)。

  • 否則:該應用程序是一個“常規”.NET應用程序。 Environment.GetCommandLineArgs()用於重新創建原始命令行, Process.Start(Application.ExecutablePath)用於重新啟動應用程序。

使用Application.Exit -mechanism來嘗試結束當前實例可能是您發現它不可靠的原因。 取消發送結束事件的表單可以中斷它。 另見這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM