.net 卸载应用程序域

.net 卸载应用程序域,.net,appdomain,.net,Appdomain,很好,我有AppDomainA,它可以生成AppDomainB。AppDomainB然后启动AppDomainC 如果在AppDomainA中我卸载了AppDomainB,那么AppDomainC是否也会被卸载,或者我必须确保自己处理它?最好的方法是尝试一下。下面是创建AppDomainA的示例,它创建AppDomainB。我们让B做一些工作,然后卸载A internal class Program { private static Timer _timer; private s

很好,我有AppDomainA,它可以生成AppDomainB。AppDomainB然后启动AppDomainC


如果在AppDomainA中我卸载了AppDomainB,那么AppDomainC是否也会被卸载,或者我必须确保自己处理它?

最好的方法是尝试一下。下面是创建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对象的引用,以便调用其卸载方法。