[英]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.exe
的Process.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.