Comment vérifier si AppDomain est déchargé?

J’utilise un tas d’objects dans un autre AppDomain via un proxy. Ils appartiennent à un domaine distinct, car je dois permuter à chaud des assemblys contenant ces objects. Je décharge donc un AppDomain après avoir utilisé les assemblys qu’il héberge.

Je souhaite vérifier parfois si j’ai déjà déchargé un AppDomain (ou si, d’une manière ou d’une autre, il a été déchargé seul ou à des fins similaires) à des fins de test. Y a-t-il un moyen de faire cela?

Le moyen évident est de faire quelque chose qui AppDomainUnloadedException une AppDomainUnloadedException , mais j’espère qu’il y a un autre moyen.

Je crois que vous pouvez utiliser une combinaison de stockage de références de AppDomain dans un Dictionary donné Dictionary où la valeur bool est si elle est chargée ou non, et gérer l’événement AppDomain.DomainUnload .

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

De cette façon, vous pourrez vérifier si un AppDomain est déchargé:

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

Vous pouvez également utiliser AppDomain.Id tant que clé:

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

… et la déclaration if ressemblerait à ceci:

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

Vous pouvez lister tous les domaines d’applications de votre programme avec le code de ce lien stackoverflow . Ensuite, vous pouvez les comparer par ID ou FriendlyName ou quelque chose de similaire.