4

我最初对 Environment.Exit 的看法是:

  1. 如果从默认 AppDomain 调用,该进程将终止。

  2. 如果从默认以外的 AppDomain 调用,AppDomain 将终止并将退出代码推送到 AppDomain.ExecuteAssembly 的返回中。

这对我来说似乎是合乎逻辑的,因为加载的 AppDomain 由于调用 Environment.Exit 而不是像https://stackoverflow.com/questions接受的答案那样以“}”结尾而不是在“}”处结束,因此可以预见是不希望的/3971101/c-sharp-whats-the-best-way-to-end-a-program谈到了。

但是 Environment.Exit 的MSDN 描述如下:

终止此进程并为底层操作系统提供指定的退出代码。

所以这让我想知道,Environment.Exit 是否像 MSDN 所说的那样杀死了整个过程,还是像我最初的假设一样工作?

4

3 回答 3

3

MSDN 库文章当然是准确的。不,您不能只调用 Environment.Exit() 并希望它能够工作,它有 CAS 需求。高大上,必须信任代码才能运行危险代码 SecurityPermissionFlag.UnmanagedCode。您通常只能完全信任它。

AppDomain 中的沙盒代码非常简单,这个 MSDN 页面显示了如何。

于 2013-02-28T19:48:26.887 回答
2

我已经创建了一个测试解决方案来测试这个,看起来 MSDN 是正确的。

如果从任何地方调用 Environment.Exit,整个过程都会退出。考虑到这一点,Environment.Exit 仅应在您希望终止代码正在运行的进程时使用,而不仅仅是退出您的应用程序。

调用 Environment.Exit 以退出您的应用程序,可能会导致在 AppDomain 中加载您的软件的其他应用程序出现问题。

于 2013-02-28T19:36:04.247 回答
0

我会说 Environment.Exit 理想情况下不应该被使用,如果使用它,很可能在应用程序中存在设计错误。当不再有前台线程运行时,“.NET 进程”将自动退出。如果您退出主线程,并且没有其他前台线程,那么您的应用程序将退出。您应该能够跟踪所有前台线程,并有一种安全的方式让它们一个接一个地退出。

如果你必须依赖 Environment.Exit 那么你就有问题了。

于 2013-02-28T19:50:50.783 回答