C# Application.Restart在.NET中如何工作?

C# Application.Restart在.NET中如何工作?,c#,.net,C#,.net,这个问题与如何重新启动应用程序无关。我已经通过使用互斥锁和辅助启动程序实现了这一点。在使用Application.Restart遇到一些问题后,我不得不求助于此 在任何情况下,由于不能流利地使用IL,我想知道是否有人可以首先解释Application.Restart是如何工作的。这是对运行时的调用,但运行时具体做什么?它如何关闭现有实例以及如何知道何时启动新实例 。。。不能流利地使用IL 您是否考虑过使用(Reflector,dotPeek)或更好的.NET framework代码 无论如何 在

这个问题与如何重新启动应用程序无关。我已经通过使用互斥锁和辅助启动程序实现了这一点。在使用Application.Restart遇到一些问题后,我不得不求助于此

在任何情况下,由于不能流利地使用IL,我想知道是否有人可以首先解释Application.Restart是如何工作的。这是对运行时的调用,但运行时具体做什么?它如何关闭现有实例以及如何知道何时启动新实例

。。。不能流利地使用IL

您是否考虑过使用(Reflector,dotPeek)或更好的.NET framework代码

无论如何

在休闲外观中,它可以执行以下操作:

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

  • 查看它是否可以确定
    程序集。GetEntryAssembly()
    。如果这是
    null
    调用
    应用程序.Restart()
    很可能是从非托管代码执行的,操作会向调用方抛出
    NotSupportedException

  • 查看当前进程是否为
    ieexec.exe
    ,如果是,请使用它重新启动应用程序(有关
    ieexec.exe
    的更多信息,请参阅)。实际上,这也是一个对
    ieexec.exe
    Process.Start()
    调用,但是命令行参数不是由
    Environment.GetCommandLineArgs()
    (见下文)收集的,而是通过读取
    APP\u LAUNCH\u URL
    应用程序域数据收集的

  • 查看应用程序是否为一次点击应用程序(
    ApplicationDeployment.IsNetworkDeployed
    ),如果是,则调用CLR内部本机代码以(重新)启动:
    CorlaunApplication
    。唯一与CLR本机部分相似的公开源代码是共享源CLI(sscli),它基于.NET 2.0框架,并且部分不完整。它包含该函数的定义(
    clr\src\vm\hosting.cpp
    ),但它只是一个存根。最后,它将使用一些方法重新启动进程(例如Win32的
    CreateProcess
    API)

  • 否则:该应用程序是“常规的”.NET应用程序
    Environment.GetCommandLineArgs()
    用于重新创建原始命令行,而
    Process.Start(Application.ExecutablePath)
    用于重新启动应用程序


使用
应用程序.Exit
-机制尝试结束当前实例可能是您发现它不可靠的原因。取消发送关闭事件的表单可以中断它。还有一个问题。

Bah,你的答案比我的好得多,我不妨删除我的:(.1祝你好运,先生!@Christian.K:谁调用
进程.Start(Application.ExecutablePath)
?@joe调用
应用程序.Restart()的线程)
这是函数返回之前做的最后一件事。感谢您的澄清。我不知道为什么我没有使用反编译器。在任何情况下,您是否同意使用带有辅助启动器应用程序的互斥锁作为一种可接受的方法?这完全取决于应用程序的部署方式,如果您使用ClickOnce,您可以只使用c所有(然后是
Application.Restart()
,事实上,用例在
Restart
的MSDN页面上),但是在大多数情况下,我会使用一个单独的更新程序存根应用程序。