考虑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;
}
}
所以,问题是在上面的ReceiveMethod
中,ExportedClass
是在我在构造函数中动态加载的程序集中定义的类。那么,我能否以某种方式解析ExportedClass
的类型,以便我不必使用dynamic
?
答案 0 :(得分:5)
您有一些选择
我通常会使用第二种方法。只需定义ExportedClass在另一个(共享)程序集中实现的接口。然后,您可以尝试将创建的实例强制转换为该接口。那样:
ISomeInterface obj = Activator.CreateInstance(typeOfClass) as ISomeInterface;
当然,这是假设您可以控制引用的库。或者,如果您要定义插件基础结构或类似内容,则应将其作为一项要求包含在内。
答案 1 :(得分:1)
如果您的代码中有方法签名,请执行以下操作:
public bool ReceiveMethod(ExportedClass classobj)
{
return true;
}
这意味着您已经引用了程序集。您无需动态加载它。还有反射你得到的类型。然后,您必须创建该类型的对象。
dynamic只能保存对任何类型对象的引用,但它不会为您实例化该对象。 假设您使用Activator.CreateInstance创建实例,那么您可以轻松地将生成的对象转换为您知道的特定类型。
但是如果您知道特定类型,那么您可能已经引用了程序集,除非您接受该对象的共享接口或基类,但您说该方法接受该程序集中定义的类的对象所以你已经引用了程序集。
如果我认为您的方法签名不是那样,并且您想知道您的选项是什么,那么@ Botz3000表示您可以使用反射,动态或共享界面。