如何检查AppDomain是否已卸载?

时间:2015-12-17 11:16:49

标签: c# .net appdomain

我通过代理在另一个AppDomain中使用了一堆对象。它们位于一个单独的域中,因为我需要热交换包含这些对象的程序集,所以在我使用它托管的程序集完成后我卸载了一个AppDomain。

我想有时检查一下我是否已经卸载过去的AppDomain(或者它以某种方式单独卸载)以进行测试。有没有办法做到这一点?

显而易见的方法是做一些会抛出AppDomainUnloadedException的东西,但我希望还有其他方法。

2 个答案:

答案 0 :(得分:3)

我相信您可以在某些给定的AppDomain中使用Dictionary<AppDomain, bool>的引用组合,其中bool是加载或卸载的,并处理AppDomain.DomainUnload事件

Dictionary<AppDomain, bool> appDomainState = new Dictionary<AppDomain, bool>();

AppDomain appDomain = ...; // AppDomain creation
appDomain.DomainUnload += (sender, e) => appDomainState[appDomain] = false;
appDomainState.Add(appDomain, true);

这样您就可以检查AppDomain是否已卸载:

// "false" is "unloaded"
if(!appDomainState[appDomainReference]) 
{
}

或者,您可以使用AppDomain.Id作为密钥:

Dictionary<int, bool> appDomainState = new Dictionary<int, bool>();

AppDomain appDomain = ...; // AppDomain creation
appDomain.DomainUnload += (sender, e) => appDomainState[appDomain.Id] = false;
appDomainState.Add(appDomain.Id, true);

... if语句如下所示:

// "false" is "unloaded"
if(!appDomainState[someAppDomainId]) 
{
}

答案 1 :(得分:1)

您可以使用此stackoverflow link中的代码列出程序中的所有appdomains。然后,您可以按IDFriendlyName或类似的方式对它们进行比较。