Il faut que tu aies un assembly intermédiaire qui définit les interfaces implémentées par la DLL. Cet assembly devra être commun aux 2 parties (toi et le service qui implémente la DLL utilisée par le site), et sera référencé en dur des 2 côtés. C'est nécessaire pour établir un "protocole" d'interaction entre les 2. Ensuite l'implémentation de la DLL peut changer sans impacter le site, mais si l'interface change il faut la changer des 2 côtés
Pour utiliser la DLL, il faut la charger dynamiquement avec Assembly.Load, et instancier par réflexion le type dont tu as besoin, puis le caster vers l'interface qui va bien. Ensuite tu manipules uniquement l'interface, sans avoir besoin de connaître les détails de l'implémentation.
Un petit exemple pour que ce soit plus clair :
Supposons que la lib s'appelle MaLib.dll, et qu'elle contient une classe Toto utilisée par le site
Il faut créer une autre librairie (disons MaLib.Interop.dll), dans laquelle tu déclares une interface IToto qui décrit les membres publics de Toto. Il faut ajouter à MaLib.dll une référence vers MaLib.Interop.dll, et modifier la classe Toto pour qu'elle implémente IToto
Du côté du site web, tu ajoutes aussi une référence à MaLib.Interop.dll (et pas à MaLib.dll). Tu charges dynamiquement MaLib.dll à partir du fichier de la façon suivante :
Assembly asm = Assembly.LoadFile(@"le\chemin\vers\MaLib.dll");
et tu crées une instance de Toto que tu affectes à une variable de type IToto :
1 2
| Type typeToto = asm.GetType("LeNamespace.Toto");
IToto toto = Activator.CreateInstance(typeToto) as IToto; |
De cette façon, tu ne références pas en dur les types de MaLib.dll, mais tu as quand même un moyen de les manipuler via l'interface.
Evidemment, si Toto a des nouvelles fonctionnalités qui doivent être utilisées par le site, il faudra modifier l'interface IToto et recompiler les 2 projets
Partager