我通过代理在另一个AppDomain中使用了一堆对象。它们位于一个单独的域中,因为我需要热交换包含这些对象的程序集,所以在我使用它托管的程序集完成后我卸载了一个AppDomain。
我想有时检查一下我是否已经卸载过去的AppDomain(或者它以某种方式单独卸载)以进行测试。有没有办法做到这一点?
显而易见的方法是做一些会抛出AppDomainUnloadedException
的东西,但我希望还有其他方法。
答案 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。然后,您可以按ID
或FriendlyName
或类似的方式对它们进行比较。