2015-12-17 2 views
2

J'utilise un tas d'objets dans un autre AppDomain via proxy. Ils se trouvent dans un domaine distinct, car j'ai besoin d'assembler à chaud les assemblages qui contiennent ces objets, donc je Décharge un AppDomain une fois que j'ai fini d'utiliser les assemblages qu'il héberge.Comment vérifier si AppDomain est déchargé?

Je veux vérifier parfois si j'ai déchargé un AppDomain dans le passé (ou s'il a été déchargé d'une manière ou d'une autre par lui-même ou quelque chose d'autre) à des fins de test. Y a-t-il un moyen de faire cela?

La manière évidente est de faire quelque chose qui lancerait un AppDomainUnloadedException, mais j'espère qu'il y a une autre manière.

+0

Certains programmeurs essaient complètement trop difficile d'éviter d'utiliser une variable * bool *. Il n'y a pas de "ou quelque chose". –

+0

@HansPassant Comme c'est à des fins de test, il y a généralement un * ou quelque chose *, même si vous êtes catégoriquement certain qu'il ne devrait pas y en avoir. – GregRos

Répondre

3

Je crois que vous pouvez utiliser une combinaison de stockage des références de AppDomain dans certains Dictionary<AppDomain, bool> donné où le bool est si son chargé ou déchargé, et de gérer l'événement 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); 

De cette façon, vous serez en mesure de vérifier si un AppDomain est déchargé:

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

Vous pouvez également utiliser AppDomain.Id comme la clé:

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); 

... et si la déclaration devrait ressembler à ceci:

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

Merci pour votre suggestion. Je le ferai s'il n'y a pas de moyen direct de vérifier si le domaine a été déchargé (puisque c'est à des fins de test, moins il y a de points de défaillance, mieux c'est). – GregRos

+0

@GregRos Pas de problème. Si je ne me trompe pas, ce sera votre meilleur pari. Évidemment, vous pouvez changer la façon dont vous stockez l'état 'AppDomain': ce peut être un dictionnaire comme je vous l'ai suggéré, une liste de classes utilisant un type personnalisé' AppDomainState' qui pourrait avoir une propriété 'Unloaded' ... –

1

Vous pouvez lister tous les domaines d'application de votre programme avec le code stackoverflow link. Ensuite, vous pouvez les comparer par ID ou FriendlyName ou quelque chose de similaire.