回答这些问题的最佳方法是使用 Reflector(或 Microsoft 的免费调试代码,如果可用)查看代码本身。
使用 Reflector,您可以看到(在 .NET Framework 4.0 中)System.Windows.Forms.Application.Restart查找四种不同类型的应用程序:
- 初始检查
Assembly.GetEntryAssembly是,如果是则Nothing抛出一个;NotSupportedException
- 与当前的 .NET Framework
Process.GetCurrentProcess.MainModule.FileName位于ieexec.exe同一文件夹中(特别是模块定义所在的文件夹Object);
ApplicationDeployment.IsNetworkDeployed是True;和
- 一般情况。
所有三种支持的情况都确定了再次启动流程的方法,再次调用Application.ExitInternal并启动流程。
Application.ExitInternalFormClosingEventArgs.Cancel关闭打开的表单,包括通过设置为来检查试图中止关闭的表单True。如果没有表单尝试取消,则关闭表单并使用清理ThreadContext.ExitApplication所有表单(或调用它们)。ThreadConnextsDisposedApplicationContext.ExitThread
NB NoThread.Abort被调用,因此线程不会以任何方式显式结束。此外,Windows.Forms ModalApplicationContext, 甚至不调用ThreadExit普通人所做的“事件” ApplicationContext。
(请注意,所有三种受支持的情况都Application.Restart 忽略了 的结果Application.ExitInternal,因此,如果一个表单确实尝试中止所有发生的事情,那么任何其他表单都没有机会关闭,并且 ThreadContexts 没有被清理!)
对于您的问题,重要的是,它不会尝试实际退出当前线程或整个应用程序(除了关闭打开的表单和线程上下文)。
但是,当您MsgBox("restarting")执行时,新应用程序已经启动。
调用后需要手动退出应用Application.Restart。在“在表单中运行[ing]”的情况下(您没有显示测试的代码)表单已关闭,这就是您认为当前应用程序结束的内容,或者是额外的东西Windows.Forms(或 VB ) 设置意味着应用程序由在确实发生的清理运行时引发的“事件”之一退出。
换句话说,在测试它之前,我希望MsgBox即使此代码在Click表单事件中出现,表单首先消失,应用程序同时重新启动。
测试后,MsgBox尝试出现,因为我听到对应的哔哔声,如果我将其注释掉,哔哔声不会发生。因此,即使应用程序应该打开一个消息框,某些东西也会导致应用程序退出,甚至将 aMsgBox放在 aFinally之外Application.Run也不会出现在 a 上Restart。MsgBox(请注意,如果您在 之后调用,也会看到类似的效果Application.Exit。)
因此,由(或 VB)设置的Windows.Forms东西实际上确实调用了类似Environment.Exit调用 Win32ApiExitProcess并且不考虑Finally或调用Disposeor的东西Finalize。
请注意,Application.Restart文档暗示它不适用于控制台应用程序,尽管它目前工作正常(除了不立即退出,这不是由 暗示的Application.Exit)。