2016-10-26 1 views
1

J'ai besoin de charger SomeMixedAssembly.dll dans le domaine supplémentaire (c'est-à-dire, ce n'est pas le domaine principal) et de décharger ce domaine après avoir terminé la tâche. Aussi le SomeMixedAssembly.dll charge le SomeMixedAssembly_2.dll qui est nécessaire pour son travail. Les deux assemblées sont mélangées et écrites pas par moi. Ce n'est pas un problème, mais le problème est le SomeMixedAssembly.dll charge le SomeMixedAssembly_2.dll dans le domaine principal également.Est-il possible d'éviter de charger un chargement d'assembly dans `AppDomain`?

Est-il possible d'éviter de charger un chargement d'ensemble dans le AppDomain principal?

+2

Vous devez créer votre propre proxy qui gère la communication entre le domaine par défaut et votre domaine créé. Ce proxy est ensuite chargé dans son propre domaine et est un wrapper autour des types définis dans 'SomeMixedAssembly'. Ne fuyez aucun des types dans 'SomeMixedAssembly' directement via le proxy. Cela devrait empêcher 'SomeMixedAssembly' d'être chargé dans le domaine par défaut ainsi que ses dépendances. – Igor

+1

Pour clarifier le commentaire Igors, l'assembly ne se charge pas lui-même dans le domaine principal. * Vous * copiez un objet du domaine auxiliaire vers le domaine principal en forçant le type à charger. – usr

+0

Je connais 'AppDomain.AssemblyResolve' et j'utilise un proxy. L'exemple de mon "HelloWorld" est ici (git repository): https://bitbucket.org/Andrey-Bushman/acadcui/wiki/Home Le 'SomeMixedAssembly.dll' est' AcCUI.dll' et le 'SomeMixedAssembly_2.dll' est 'AcDbMgd.dll' dans cet exemple. –

Répondre

0

Oui, vous pouvez intervenir dans le processus de chargement de l'assembly, en utilisant par exemple le gestionnaire d'événements AppDomain.AssemblyResolve. Mais les assemblys se chargent généralement paresseux à la demande et vous ne pouvez pas simplement ne pas les charger et attendre que votre programme fonctionne. L'assembly chargé dans un autre AppDomain ne peut pas fonctionner automatiquement comme l'original par définition.

Mais une telle intervention peut être utile si vous souhaitez charger l'assemblage à partir d'un endroit inhabituel, vérifier certains prérequis ou rechercher des bogues.

+0

Je le sais et je l'utilise, mais ça ne m'aide pas. Vous pouvez voir mon "Hello World" avec ce problème ici: https://bitbucket.org/Andrey-Bushman/acadcui/wiki/Home –

+0

La seule raison possible que j'ai pu voir de votre code: Assemblée qui contient Bushman.AcadCUI.Section La classe peut avoir une référence directe ou chaînée à Acdbmgd.dll. Essayez de définir le point d'arrêt sur la ligne "ISection section =" et vérifiez les assemblys chargés. Ensuite, sortez et vérifiez à nouveau. Si ma supposition est correcte, l'assemblage indésirable chargé dans cette étape. Ensuite, IlSpy ou Reflector pourrait vous aider. – olk

+0

Cela se passe dans la ligne 83 du fichier 'Program.cs'. –