如何应用程序.在.net中重新启动工作
本文关键字:重新启动 工作 net 应用程序 | 更新日期: 2023-09-27 18:18:54
这个问题不是关于如何重新启动应用程序的。我已经通过使用互斥锁和辅助启动器应用程序实现了这一点。在使用Application.Restart遇到一些问题后,我不得不求助于这个方法。
在任何情况下,不是流利的IL,我想知道是否有人可以解释如何应用程序。重启首先是有效的。它是对运行时的调用,但运行时究竟做什么?它如何关闭现有实例以及如何知道何时启动新实例?
…不熟练使用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)。 -
Else:该应用程序是一个"常规"的。net应用程序。
Environment.GetCommandLineArgs()
用于重新创建原始命令行,Process.Start(Application.ExecutablePath)
用于重新启动应用程序。
使用Application.Exit
-机制试图结束当前实例可能是您发现它不可靠的原因。取消发送关闭事件的表单可以中断它。