如何应用程序.在.net中重新启动工作



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

在任何情况下,不是流利的IL,我想知道是否有人可以解释如何应用程序。重启首先是有效的。它是对运行时的调用,但运行时究竟做什么?它如何关闭现有实例以及如何知道何时启动新实例?

…不熟练使用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框架,也有一部分不完整。它包含该函数的定义(clrsrcvmhosting.cpp),但它只是一个存根。最后,它将使用一些方法来重新启动进程(例如Win32的CreateProcess API)。

  • Else:该应用程序是一个"常规"的。net应用程序。Environment.GetCommandLineArgs()用于重新创建原始命令行,Process.Start(Application.ExecutablePath)用于重新启动应用程序。

使用Application.Exit -机制试图结束当前实例可能是您发现它不可靠的原因。取消发送关闭事件的表单可以中断它。

最新更新