2011-10-22 5 views
7

Probablement une copie de: Can I prevent an uncaught exception in another AppDomain from shutting down the application?Puis-je isoler mon AppDomain actuel d'un déchirement, lorsqu'un autre AppDomain que j'ai chargé lance une exception non gérée?

J'ai essayé toute la journée pour trouver la réponse à cette question. Je veux juste m'assurer que la réponse est bien non, avant de jeter tout le code que j'ai fait pour isoler mes pilotes dans leurs domaines respectifs et les remplacer par des processus old-school.

Donc la question formelle est la suivante. Ayant un domaine par défaut "ad-default", dans lequel je crée un nouveau domaine d'application "hébergé par la publicité", puis-je éviter que les exceptions non gérées par "hébergé par la publicité" abaissent "ad-default"? Je suis conscient que je peux observer les exceptions en se connectant à l'événement UnhandledException du domaine «hébergé par la publicité», mais je ne trouve aucun moyen de les empêcher de se propager au domaine «ad-default».

Est-ce vrai? Mais pourquoi voudrions-nous même AppDomain, s'ils ne fournissent pas l'isolement?

EDIT: La réponse est malheureusement, voir cette réponse pour l'explication: AppDomain, handling the exceptions

+1

Pas un doublon. –

Répondre

3

La seule façon d'isoler les exceptions dans un fil dans un autre appdomain de démolissant le domaine par défaut est d'utiliser:

Ce qui met à false l'indicateur IsTerminating de l'exception nonhandlée et empêche l'arrêt du domaine par défaut.

Ce que nous avons fait dans notre cas était de se connecter à UnhandledExceptionHandler dans les deux domaines. Nous déclenchons ensuite un semafore dans le "ad-hosted" qui sera repris par un thread créé à cet effet dans "ad-default", qui à son tour dispose de la "ad-hosted"

Ceci est un hack et ne survivra probablement pas dans les générations futures du framework, mais cela rendra "ad-default" plus robuste, en ce sens qu'il ne sera pas détruit sur des exceptions non gérées dans le "ad-hosted"

up un gestionnaire d'événement dans "ad-default" qui va lancer l'expéditeur comme nom de domaine et vérifier si l'exception provient de "ad-default", si c'est le cas, nous supprimons le "ad-default", émulant le comportement de .net 2.0, même avec le paramètre d'exécution décrit ci-dessus.

Espérons que cela donne à quelqu'un une idée sur la façon de rendre un hôte de plugin plus résilient.