-
DLL et plug-in
Bonjour
Ma question est simple.
J'ai un programme Hote dans un repertoire "Bin".
Ce programme peut créer dynamiquement des objets provenant d'une DLL (qui correspond à un plug-in). L'assembly ou se trouve l'objet n'est pas dans le repertoire Bin.
Mon problème :
Quand j'appelle une méthode de Sérialisation de cet objet, ca plante.
Raison : L'assembly se trouvant dans une autre DLL, la définition de l'objet que je sérialise se trouve également hors du répertoire Bin de l'application ayant créer cet objet.
Comment puis-je résoudre celà ? sachant que j'aimerais éviter de mettre
TOUS les plug-in avec leurs dépendances dans un seul répertoire.
Merci à tous.
-
Votre explication du problème ne me paraît pas très claire.
Exposez le problème puis vos hypothèses.
La notion de dll et d'emplacement de celle-ci n'a que très peu à faire avec .NET et ses assemblies.
Comment chargez-vous les classes du plug-ins ?
Utilisez-vous un ApplicationDomain dédié pour le chargement des assemblies de chaque plug-ins ?
-
ok, j'explicite plus clairement
J'ai un projet qui genère un EXE.
Dans ce projet, j'instancie des objets implémentant une interface IPlugIn.
Des assemblys (autres projets de librairie) implémente des objets MyPlugIn (par exemple) implémentant l'interface IPlugIn.
Ensuite, dans l'exe, je cherche les assemblys contenues dans un répertoire (différent de l'exe), je les charge (avec Assembly.LoadFrom()) puis je regarde si une des classes de cette assembly implémente mon interface. Si c'est le cas, je finis par un
Activator.CreateInstance(). Jusque là, tout fonctionne bien.
A noter que pour "caster" le retour de CreateInstance() en IPlugIn, je suis obligé de ne pas avoir la dll de déclaration des interfaces dans mes deux répertoires (celui de l'exe, celui de la dll car apparemment, en montant l'assembly du plugin, l'assembly d'interfacage est montée et est donc, différente en terme de fichier (oui, je sais, c bizarre)) que l'assembly d'interfacage montée par l'exe...)
Une fois mon plugin monté, tout fonctionne à merveille jusqu'au moment ou j'essaye de Serialiser ou déserialiser ce plugin. Lors de la serialisation ou deserialisation, le sérialiseur m'indique qu'il ne connait pas une des assembly dont dépend ce fameux plug-in (alors que cette assembly a été monté lors du chargement du plug-in)...
En fait, j'ai l'impression que lorsque je crée mon objet, il y a une différenciation qui est faite entre la création et l'utilisation en terme de DLL vu comme dépendance.
J'ai une solution possible : le GAC.. mais j'aimerais bien l'éviter comme solution.
Une idée ?
-
Pouvez-vous vous arranger des objets de l'assembly du Plug-In dans un autre AppDomain que celui par défaut ?
-
salut
n'étant pas très familier à l'utilisation des AppDomain, pourrais tu m'en dire plus sur la façon que tu aurais pour faire ce que tu proposes ?
-
-
bonsoir,
essaye ça, c'est plus clair et c'est ce que j'ai cru comprendre de ton problème.
En revanche, sachant que je n'ai pas tout saisi à ton histoire (désolé mais j'ai trouvé ça pas très précis et clair, mais après une dure journée j'ai peut-être l'esprit dans les choux...), tout ça pour dire as-tu regardé du coté de MEF (Managed Extensibility Framework)?
Tu y trouvera des outils pour faire des plug-in "facilement", tu as juste à comprendre comment ça fonctionne : le lien pour te former si besoin : Documentation et tutos
Pour les exemples :exemples.
Bon courage et bonne prog
-
merci à tous les deux
Je regarde celà de suite :)
(si je trouve ma réponse, je l'indiquerais bien sur rapidement :) )
[EDIT]
J'ai pas aimé les MEF, par contre, les tutoriaux m'ont permis d'arriver à faire ce que je veux...
LE truc surprenant est qu'il faut créer un domaine et charger l'assembly de chargement des plug-in dans ce domaine pour pouvoir ensuite spécifier le répertoire ou se trouve les plug-in à charger :)
Enfin, je dois continuer plus en amont les tests, mais ça a l'air de fonctionner tout à fait comme je souhaitais :)
Merci beaucoup. J'ai appris un truc !!!
-
Finalement, en suivant les liens fournis, j'ai trouvé une solution...
J'ai une classe Static qui crée un loader (comme dans l'exemple ou l'on trouve un assembly loader (dans un des tutoriaux référencés)... et ce loader charge ensuite le plug-in qui convient et crée l'instance de mon plug-in en cherchant si une classe dans la dll chargée implémente l'interface (dont le nom est passé en paramètre).
Merci beaucoup. Cela fonctionne plutôt bien. Après, ca demande quelques ajustements parce qu'une classe héritant de MarshalByRefObject n'est pas sérialisable (donc, j'ai isolé les données à sérialiser dans une classe membre de ma classe plug-in :) )
Enfin, j'ai trouvé ma solution et ca fait plaisir de voir que c'était plutot "simple" et que surtout, j'ai peu de modification à apporter à mon "gros" logiciel :)