2

这是一些示例代码:

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,例如在终结器中调用它。

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

4

1 回答 1

3

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

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

于 2009-12-11T23:29:03.767 回答