2

我知道如何获得实现接口的所有类型,例如使用此codeApi控制器获取实现接口的所有类型

但是我还没有想出为什么我不能在我的Asp.Net MVC ApiController中进行这项工作。我有两个项目(道歉的命名惯例我创建了一个从无到有的解决方案只是为了确保我的现有不是错误的原因。):

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

的WebAPI有一个项目引用ClassLibrary1的。

调用我的ApiController它会查看bin目录中的dll。它能够获得ClassLibrary1.dll,但是当它试图查看哪种类型可从Interface1分配时,它找不到任何东西。

enter image description here

代码仅仅是一个.NET MVC项目和类库和托管here

回答

0

的问题是,必须从参考加载两次,因此ClassLibrary1.Interface1组装ClassLibrary1是不相同的接口ClassLibrary1.Interface1从加载组件。

Interface1移动到它自己的共享库中,并在ClassLibrary1WebAPI中引用此共享库来解决您的问题。

关于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

相关问题