gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:22:55 27 4
gpt4 key购买 nike

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

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

最佳答案

... not being fluent with IL, ...

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

无论如何。

粗略地看,它做了以下事情:

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

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

  • 查看当前进程是否为 ieexec.exe,如果是则使用它重新启动应用程序(有关 ieexec.exe 的更多信息,请参阅 here ).实际上,这几乎也是对 ieexec.exeProcess.Start() 调用,但 Environment.GetCommandLineArgs()< 不会收集命令行参数(见下文),但通过读取 APP_LAUNCH_URL 应用程序域数据。

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

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

使用 Application.Exit 机制来尝试结束当前实例可能是您发现它不可靠的原因。取消发送关闭事件的表单可以中断它。另见 this所以问题。

关于c# - Application.Restart 在 .NET 中如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17182839/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com