【问题标题】:How does Application.Restart work in .NET?Application.Restart 如何在 .NET 中工作?
【发布时间】:2013-06-19 04:23:37
【问题描述】:

这个问题不是关于如何重新启动应用程序。我已经通过使用 Mutex 和辅助启动器应用程序实现了这一目标。在使用 Application.Restart 遇到一些问题后,我不得不求助于它。

无论如何,我不熟悉 IL,我想知道是否有人可以首先解释 Application.Restart 的工作原理。这是对运行时的调用,但运行时到底做了什么?它如何关闭现有实例以及如何知道何时启动新实例?

【问题讨论】:

    标签: c# .net


    【解决方案1】:

    ... 不流利使用 IL,...

    您是否考虑过使用 decompiler(Reflector、dotPeek)或者更好的 .NET 框架的 reference source 代码?

    无论如何。

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

    • 在以下所有情况下,当前实例都使用Application.ExitInternal() 终止。这就是公开的Application.Exit() 方法的要点,省略了一些安全检查/断言。

    • 看看是否能确定Assembly.GetEntryAssembly()。如果是null,则Application.Restart() 的调用很可能是从非托管代码完成的,并且该操作会向调用者抛出NotSupportedException

    • 查看当前进程是否为ieexec.exe,如果是则使用它重新启动应用程序(有关ieexec.exe的更多信息请参阅here)。实际上,这几乎也是对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 试图结束当前实例可能是你觉得它不可靠的原因。取消发送关闭事件的表单可以中断它。另请参阅this SO 问题。

    【讨论】:

    • 呸,你的答案比我的好多了,我还不如删掉我的:(。+1 给你好先生!
    • @Christian.K:谁给Process.Start(Application.ExecutablePath)打电话?
    • @joe 调用Application.Restart()的线程是函数在返回之前所做的最后一件事。
    • 感谢您的澄清。我不确定为什么我没有使用反编译器。在任何情况下,您是否赞同将互斥锁与辅助启动器应用程序一起使用作为一种可接受的方法?
    • 这完全取决于你的应用程序是如何部署的,如果你使用 ClickOnce,你可以调用Update(然后Application.Restart(),实际上用例在MSDN页面上@ 987654348@) 但是在大多数情况下,我会使用单独的更新程序存根应用程序。
    猜你喜欢
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 1970-01-01
    相关资源
    最近更新 更多