2012-02-09 61 views
3

考虑在DLL以下代码:从汇编动态解析类型通过反射加载

public class ReceivingClass 
{ 
    private Assembly myAssembly; 
    private Type typeOfClass; 
    public ReceivingClass() 
    { 
     myAssembly = Assembly.LoadFile(@"E:\VSProjects\TestDynamicLinking\MyLib\bin\Debug\MyLib.dll"); 
     //Can I use this type somehow to resolve the type in the below method? 
     typeOfClass = myAssembly.GetType("ExportedClass"); 
    } 
    public bool ReceiveMethod(ExportedClass classobj) 
    { 
     return true; 
    } 
} 

因此,问题是,在上面的ReceiveMethodExportedClass是其在装配中定义的类,我动态加载到构造函数中。那么,我可以以某种方式解决ExportedClass的类型,以便我不必使用dynamic

回答

5

你有一些选择是要么

  • 参考实际的组件(可能无法在你的情况为你动态加载),
  • 使用共享的接口类型器械(前提是你能编辑装组件),
  • 或使用动态/反射

我通常使用第二种方法。只需定义一个ExportedClass在另一个(共享)程序集中实现的接口。然后,您可以尝试将创建的实例转换为该接口。像这样:

ISomeInterface obj = Activator.CreateInstance(typeOfClass) as ISomeInterface; 

当然,这是假设你有控制引用的库。或者,如果你正在定义一个插件基础设施或类似的东西,你应该把它作为一个需求。

1

如果你有像这样在你的代码的方法签名:

public bool ReceiveMethod(ExportedClass classobj) 
    { 
     return true; 
    } 

这意味着你已经引用组件。你不需要动态加载它。同样反射你得到的类型。然后您必须创建该类型的对象。

动态只能引用任何类型的对象,但不会为您实例化对象。 假设您使用Activator.CreateInstance创建实例,那么您可以轻松地将结果对象转换为您知道它的特定类型。

但是,如果您知道具体的类型,那么除非您接受对象的共享接口或基类,否则您可能已经引用了程序集,但是您说该方法接受在该类中定义的类的对象装配,所以你已经参考了装配。

如果我认为你的方法签名不是这样的,你想知道你的选择是什么,那么@ Botz3000说你可以使用反射,动态或共享接口。