卸载 AppDomain

Posted

技术标签:

【中文标题】卸载 AppDomain【英文标题】:Unloading AppDomains 【发布时间】:2014-03-28 12:34:18 【问题描述】:

假设我有 AppDomainA,它启动了 AppDomainB。然后 AppDomainB 启动 AppDomainC。

如果我在 AppDomainA 中B,AppDomainC 是否也会被卸载,还是我必须确保自己处理?

【问题讨论】:

应用域不属于任何人。因此,如果进程终止不是首选方式,则必须显式卸载它。它们也不能被迭代,你必须保留对 AppDomain 对象的引用,这样你才能调用它的 Unload 方法。 【参考方案1】:

找出答案的最佳方法是尝试一下。下面是一个创建 AppDomainA 的例子,它创建了 AppDomainB。我们告诉 B 做一些工作,然后卸载 A。

internal class Program

    private static Timer _timer;
    private static void Main(string[] args)
    
        var domainA = AppDomain.CreateDomain("AppDomainA");
        domainA.DomainUnload += (s, e) => Console.WriteLine("DomainA was unloaded.");
        domainA.DoCallBack(() =>
        
            var domainB = AppDomain.CreateDomain("AppDomainB");
            domainB.DomainUnload += (s, e) => Console.WriteLine("DomainB was unloaded.");
            domainB.DoCallBack(() =>
            
                _timer = new Timer(o =>
                
                    Console.WriteLine("Tick from AppDomain: " + AppDomain.CurrentDomain.FriendlyName);
                , null, 0, 1000);
            );
        );
        AppDomain.Unload(domainA);
        Application.Run(); //Run a message loop so AppDomainB can keep doing work.
    

我们看到我们收到消息 AppDomainA 已卸载,但 B 没有,并且 B 继续工作。我们的结论是您需要确保自己处理此问题。

【讨论】:

以上是关于卸载 AppDomain的主要内容,如果未能解决你的问题,请参考以下文章

从 AppDomain 解决 InvalidOperationException

c#读取类库配置文件方法

怎样彻底卸载一切2345的软件

卸载IE11发生错误,没有成功卸载全部更新?

ZoomIt怎么卸载

sqlserver2012怎么卸载干净