2

Я знаю, как получить все типы, реализующие интерфейс, например, используя этот code.Api Controller получает все типы, которые реализуют интерфейс

Однако я не понял, почему я не могу сделать эту работу в моем ASP.NET MVC ApiController. У меня есть два проекта (Извиняюсь за именовании Я создал решение с нуля, просто чтобы убедиться, что мой существующий не был причиной ошибки.):

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

WebAPI имеет ссылку на проект в ClassLibrary1.

Вызов моего ApiController, он смотрит на DLL в каталоге bin. Он может получить ClassLibrary1.dll, но когда он пытается посмотреть, какой тип назначается из Interface1, он ничего не находит.

enter image description here

код просто .net MVC проект и библиотека классов и размещение here

ответ

0

Проблема заключается в том, что вы имеете сборку ClassLibrary1 загруженной в два раза и, следовательно, ClassLibrary1.Interface1 из ссылки не то же самое, как интерфейс ClassLibrary1.Interface1 из загруженной сборки.

Переместите Interface1 в свою общую библиотеку и обратитесь к этой общей библиотеке в ClassLibrary1 и WebAPI, чтобы решить вашу проблему.

О Assembly.LoadFile, это прекрасно, если вы планируете создать такую ​​плагиновую систему. Это не нужно, если вы ссылаетесь на библиотеку, потому что тогда вы можете просто перечислить типы из уже загруженной сборки.

В этом случае вы можете использовать:

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

как предложено Bhushan Firake.

+0

Я принял это как ответ, потому что я делаю плагин, как система, и перемещение ссылки на общую библиотеку решает проблему. Другой ответ тоже полезен. –

1

Вам не нужно найти, на который ссылается на сборку своего пути, вы можете просто использовать тип, чтобы получить его сборку как показано ниже:

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(); 
     } 
    } 

Выход:

Inte rface1

Class1