2

Je sais comment obtenir tous les types qui implémentent une interface telle que l'utilisation de ce code.Api Contrôleur obtenir tous les types qui implémentent une interface

Cependant, je n'ai pas compris pourquoi je ne peux pas faire ce travail dans mon ApiController Asp.Net MVC. J'ai deux projets (excuses pour la convention de nommage j'ai créé une solution à partir de zéro juste pour vous assurer que mon existant n'a pas été la cause de l'erreur.):

.sln 
-WebAPI 
-ClassLibrary1 
    -Interface1 
    -Class1 : Interface1 

WebAPI a une référence de projet à ClassLibrary1.

En appelant mon ApiController, il regarde les DLL dans le répertoire bin. Il est capable d'obtenir ClassLibrary1.dll mais quand il essaye de regarder quel type est assignable d'Interface1 il ne trouve rien.

enter image description here

code

est juste un projet .net et mvc bibliothèque classe et hébergé here

Répondre

0

Le problème est que vous avez l'ensemble ClassLibrary1 chargé deux fois et donc ClassLibrary1.Interface1 de la référence n'est pas la même interface que ClassLibrary1.Interface1 de l'ensemble chargé.

Déplacez Interface1 vers sa propre bibliothèque partagée et référencez cette bibliothèque partagée à la fois dans ClassLibrary1 et WebAPI pour résoudre votre problème.

À propos de Assembly.LoadFile, c'est très bien si vous envisagez de faire un système comme un plugin. Cela n'est pas nécessaire si vous référencez la bibliothèque car vous pouvez alors énumérer les types de l'assembly déjà chargé.

Dans ce cas, vous pouvez utiliser:

typeof(Interface1).Assembly.GetTypes().Where(c => typeof(Interface1).IsAssignableFrom(c)); 

comme suggéré par Bhushan Firake.

+0

J'ai accepté ceci comme réponse parce que je fais un système de type plugin et déplacer la référence vers une bibliothèque partagée a résolu le problème. L'autre réponse est utile aussi. –

1

Vous n'avez pas besoin de trouver ensemble référencé par son chemin, vous pouvez simplement utiliser le type pour obtenir son assemblage comme ci-dessous:

internal class Program 
    { 
     private static void Main(string[] args) 
     { 
      var type = typeof(Interface1); 
      Assembly loadedAssembly = type.Assembly; 
      var types = loadedAssembly.GetTypes().Where(c => type.IsAssignableFrom(c)); 

      foreach (var typeFound in types) 
      { 
       Console.WriteLine(typeFound.Name); 
      } 

      Console.ReadKey(); 
     } 
    } 

sortie:

Inte rface1

Class1