我试图在运行时简单地加载一个用C#编写的dll,并在该dll中创建一个类的实例。
Assembly a = Assembly.LoadFrom(@"C:\Development\DaDll.dll");
Type type = a.GetType("FileReleaseHandler", true);
TestInterface.INeeedHelp handler = Activator.CreateInstance(type) as TestInterface.INeeedHelp;
不会抛出任何错误,如果我单步执行代码,我可以通过FileReleaseHandler类执行构造函数,但处理程序的值始终为null。
我在这里缺少什么?或者甚至有更好的方法来解决这个问题吗?
答案 0 :(得分:4)
尝试直接将Activator.CreateInstance
的结果设置为对象,而不是强制转换。
FileReleaseHandler
可能没有实现TestInterface.INeeedHelp
,在这种情况下,这将通过“as TestInterface.INeeedHelp”设置为null。
答案 1 :(得分:4)
TestInterface.INeedHelp
在哪里定义?一个常见的问题是如果你在多个程序集中有相同的接口。如果调用者和动态加载的程序集都引用同一程序集中的相同接口,那么它应该没问题。
一个微妙之处在于,如果程序集与调用程序集位于不同的目录中,它最终可能会加载同一程序集的不同副本,这可能会非常恼人:(
答案 2 :(得分:1)
检查加载到应用程序域中的程序集。是否有两个带有TestInterface.INeedHelp接口的程序集?我怀疑LoadFrom是将这个创建的对象绑定到与您尝试转换的对象不同的TestInterface.INeedHelp。尝试进行正常的向下投射,而不是所谓的“安全”投射,看看你得到了什么错误。
答案 3 :(得分:0)
问题是LoadFrom方法将dll加载到“LoadFrom”上下文中,该上下文与默认上下文不同。此上下文中类型的类型解析规则与您习惯使用的规则不同。从运行时的角度来看,主模块中定义的INeedHelp接口可能与来自LoadFrom上下文的具有相同名称的接口不同。这将导致强制转换(如TestInterface)返回null。
要查看是否是这种情况,请尝试将结果分配给对象。
答案 4 :(得分:0)
我会做类似的事情:
Assembly a = Assembly.LoadFrom(@"C:\Development\DaDll.dll");
object obj = a.CreateInstance("fullClassName",other params) as IMyType
//(if it implements an interface you referenced)