回答这些问题的最佳方法是使用 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.ExitInternal
FormClosingEventArgs.Cancel
关闭打开的表单,包括通过设置为来检查试图中止关闭的表单True
。如果没有表单尝试取消,则关闭表单并使用清理ThreadContext.ExitApplication
所有表单(或调用它们)。ThreadConnexts
Disposed
ApplicationContext.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
或调用Dispose
or的东西Finalize
。
请注意,Application.Restart
文档暗示它不适用于控制台应用程序,尽管它目前工作正常(除了不立即退出,这不是由 暗示的Application.Exit
)。