Bonjour à tous.
Depuis quelques jours je me penche sur les domaines d'application. A la lecture de plusieurs articles, j'étais tres séduit par les points suivant :
- Un AppDomain, à l'instar d'un processus permet d'isoler les données, il a son stack, son thread principal
- On peut décharger un AppDomain, et donc décharger toutes Ses assemblies
- En cas de crash du AppDomain que l'on a créé, le Domaine d'application principale n'en patie pas, il peut recharger le AppDomain "enfant".
Super ! donc on peut faire du versionning, créer des "SandBox" pour chaque plugin, gérer des exceptions critiques, juste ce qu'il me fallait !!! ...... que je me disais alors
Car d'apres mes premiers essais, rien ne va :
- Si une exception est levée dans mon AppDomain enfant, celle ci se propage jusqu'au AppDomain principal, le faisant ainsi planter !!!!
- Quand je demande à décharger le AppDomain enfant, si il a un thread toujours en cours, il ne se déchargera jamais !
- Je constate que c'est le meme thread, le thread principal (mon Main) qui sert à executer les methodes de mon plugin (pourtant dans le AppDomain enfant) !!!!!!!! ...meme thread? meme stack ! non? donc aucune isolation?!?!?
Voila, je ne vais pas trop rentrer dans le détail pour éviter un topic parechemin, juste je précise que pour communiquer entre mes 2 domaines d'application, je fais du remoting
IPlugin plg1 = (IPlugin) _monDomaineEnfant.CreateInstanceFromAndUnwrap("plugin1.dll","MesPlugins.Plugin1");
Je suis donc totalement déboussolé, et je vous demande donc simplement svp :- Qui utilise les domaines d'application multiple?
- Est il possible d'empecher une exception de se propager d'un domaine à l'autre?
- Est il possible de forcer un domaine à se décharger (à la façon qu'on décharge un processus quand on le tue) ?
Un grand merci d'avance à ceux qui sauront me répondre.
Partager