为什么终结器中的AppDomain.Unload()错误?

这是一些示例代码:

using System; namespace UnloadFromFinalizer { class Program { static void Main(string[] args) { Program p = new Program(); } AppDomain domain; Program() { this.domain = AppDomain.CreateDomain("MyDomain"); } ~Program() { AppDomain.Unload(this.domain);//<-- Exception thrown here } } } 

我有一个类,它在构造函数中创建一个AppDomain,用于在对象的生命周期内使用。 我想正确清理AppDomain,所以我想我会在终结器中调用Unload。 不幸的是,这会导致抛出CannotUnloadAppDomainException。 AppDomain.Unload的MSDN文档说明:

在某些情况下,如果在终结器中调用,则调用Unload会导致立即的CannotUnloadAppDomainException。

为什么是这样? 是否已清除成员变量“domain”? 该清理是否自动包括卸载AppDomain,还是以某种无法访问的方式存在? 有什么我应该做的,或者我可以安全地转储终结器? (只要在此过程中完全清理了GC,我就不在乎GC何时清除了我的对象。)

AppDomain类没有定义终结器,因此将像往常一样进行垃圾回收。 您的Program类的终结器将从垃圾收集器的终结器线程中调用。 发生这种情况时,无法保证您的AppDomain实例将会或不会被垃圾收集,因此您将获得未确定的行为。

我不打算使用Program的终结器,因为AppDomain无论如何都会收集垃圾,此外,当Main方法退出时,整个过程将被销毁。