J'écris du code pour implémenter une architecture de type plug-in. J'ai défini une interface, appelons-la IThing
dans l'espace de noms MyStuff
, pour le plug-in et j'ai également le code pour créer dynamiquement une instance du plug-in à partir d'une DLL. Mon code fait en regardant expose à travers des cours, des champs et des méthodes et tests en fin de compte ce qu'il trouve avec:Quand les interfaces .Net sont-elles considérées comme équivalentes?
if (typeof(IThing).IsAssignableFrom(instType))
Tout cela est bien et fonctionne bien lorsque l'interface est mis en œuvre par quelque chose dans mon propre code, ce faisant référence à la assembly qui fournit la définition MyStuff.IThing
.
Un autre développeur, dans une autre entreprise située dans un pays différent, écrit le composant enfichable.
J'ai envoyé la définition d'interface, c'est-à-dire la source C#, pour MyStuff.IThing
au développeur et il l'a inclus dans son code.
Le problème que nous avons vu en premier est que son composant, même s'il a implémenté MyStuff.IThing
, échouerait au test IsAssignableFrom
ci-dessus. La raison de l'échec semble être qu'il a la définition d'interface dans un assemblage différent (bien sûr), même s'il a le même espace de noms et que la définition de l'interface n'a pas changé. La solution ici est assez simple, c'est que je lui envoie la DLL d'assemblage contenant l'interface.
Ma question est la suivante: étant donné que l'espace de noms correspond et que la définition de l'interface est identique, pourquoi l'assemblage dans lequel il se trouve est-il important? Si l'assembly A contient MyStuff.IThing
avec exactement la même définition d'interface que MyStuff.IThing
dans l'assembly B, pourquoi ces assemblages ne sont-ils pas interchangeables pour les besoins d'une application qui souhaite fonctionner avec une instance de MyStuff.IThing
?
Cela compte parce que le nom de l'assemblage fait partie de ce qui identifie un type. –