2010-02-10 3 views
4

Je travaille sur une application qui chargera des plug-ins. Les assemblys de plug-in résident dans un répertoire situé sous le répertoire principal de mon application.Configurer un chemin privé pour charger les assemblys de plugins

ressemble à ceci:

 
MyAppFolder 
----------->ThePluginFolder 
----------------Assembly1 
----------------Dependency1 

Mon problème se produit avec Dependency1 (ce qui est un assemblage de références Assemblée 1). Le CLR ne parvient pas à le trouver.

J'ai fait quelques lectures sur Fusion, et il me semble que je pourrais corriger cela en définissant un chemin privé avec currentAppDomain.AppendPrivatePath.

Cependant, dans l'aide .NET 4.0, ils disent que cette méthode est obsolète. Ils me pointent vers AppDomainSetup, mais je ne peux pas l'utiliser pour modifier mon domaine d'application actuel.
Est-ce que quelqu'un sait ce que je peux faire d'autre pour charger ces dépendances?

Options J'ai considéré:

  1. Je pourrais manuellement à travers les boucles références de Assembly1, et si je trouve un ensemble dans le dossier de plug-in, je pouvais charger manuellement. (semble être ma meilleure option, mais je veux m'assurer que je ne manque rien)

  2. Je pourrais accrocher l'événement AssemblyResolve de mon domaine actuel (mais cela semble même bizarre - vous renvoyez une valeur. implique qu'il est multidiffusée pas? Je manipuler un aspect de plug-in (une règle d'entreprise), si une autre partie de mon application a voulu plug-in rapports? est-ce que je dois 1 gestionnaire d'événements global?

Répondre

2

Merci pour toute l'aide, les gars. Dans mon cas, j'ai trouvé que la meilleure chose à faire était de localiser les plugins dans mon répertoire principal de l'application. Bien que je puisse charger Load() ou LoadFrom() pour charger les assemblys dans des répertoires séparés (et cela semble fonctionner), j'ai rencontré des problèmes de sérialisation (l'assembly désigné avait des classes qui devaient être sérialisées et désérialisées).

J'ai essayé d'utiliser LoadFrom() et Load(), en fournissant diverses preuves dans le paramètre AssmblyName. J'ai même "manuellement" chargé les assemblages qui ont été référencés par mes plug-ins. Aucune charge dynamique ne ferait fonctionner la désérialisation (j'ai eu des exceptions).

Je ne ai trouvé 3 façons d'avoir mon travail plug-ins chargés dynamiquement avec sérialisation:

  1. Utilisez currentDomain.AppendPrivatePath pour ajouter un chemin d'accès au répertoire qui contenait mes assemblys (cette méthode est obsolète)

  2. Accroche l'événement ResolveAssembly dans l'AppDomain actuel (cela aurait fonctionné, mais il est appelé alot, et je ne veux pas impact sur la performance de mon application - notez que je n'ai pas pris de mesures, cependant).

  3. Placez simplement les assemblys dans mon répertoire principal. (c'était la solution la plus simple, et le seul argument contre cela était que la structure du répertoire n'était pas aussi ordonnée que mes autres options.) Donc, tout compte fait, j'ai emprunté cette route

+0

FWIW, vous (ou d'autres futurs visiteurs) pourrait également être intéressé par ma tentative de résoudre le problème décrit dans [cette question et ses réponses] (http://stackoverflow.com/questions/10923727/plugin-appdomains-workaround). –

+0

Merci O.R. Mappeur! – JMarsch

1

Les assemblages de plugins sont généralement chargés par réflexion en utilisant Assembly.LoadFrom et ne doivent pas être référencés par votre projet, sinon ils sont codés en dur.La seule chose commune entre l'application et le plugin devrait être un assemblage séparé contenant des interfaces que les deux références. Ensuite, vous pouvez avoir un fichier de configuration dans lequel vous spécifiez les plugins à charger lors de l'exécution.

+1

@Darin: Mon projet ne fait pas référence au plugin. (J'utilise Assembly.LoadFromFile pour le charger.) Ce qui se passe, c'est que mon projet charge un plugin de façon dynamique, le plugin, à son tour, fait référence à un assembly. par le plugin est celui qui ne charge pas – JMarsch

+0

@JMarsch: selon la documentation: 'Le contexte load-from permet de charger un assembly à partir d'un chemin non inclus dans le probe, tout en permettant que les dépendances sur ce chemin soient trouvé et chargé parce que l'information de chemin est maintenue par le contexte. » –

+0

Intéressant. Essayez-le - Peut-être que j'aurais dû choisir LoadFrom au lieu de LoadFile. – JMarsch

1

Ce scénario fonctionne pour moi, mon plugin est directement séparé de mon répertoire d'application (c'est une application web), et les DLL chargées dynamiquement trouvent leurs DLL référencées dans le même dossier. Leurs DLL référencées sont également chargées en tant que plugins par mon application, donc ils connaissent leur existence ...

+0

Yah, c'est mon option 1 - rendre l'application appelante charge les dépendances manuellement. Merci - vous avez ajouté une validation à ce plan d'attaque. – JMarsch

Questions connexes