如果不是IsDefaultAppDomain,Environment.Exit是否从任何AppDomain调用退出整个进程?

时间:2013-02-28 19:16:10

标签: .net appdomain

我对Environment.Exit的原始信念是:

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

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

  3. 这对我来说似乎是合乎逻辑的,因为加载的AppDomain无意中会因为调用Environment.Exit而不是像https://stackoverflow.com/questions/3971101/c-sharp-whats-the-best-way-to-end-a-program的接受答案那样以“}”结尾而无意中杀死整个进程。的。

    然而,Environment.Exit的MSDN description如下:

      

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

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

3 个答案:

答案 0 :(得分:3)

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

AppDomain中的沙盒代码非常简单,this MSDN page显示了如何。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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

如果您必须依赖Environment.Exit,那么您就会遇到问题。