动态加载DLL

6

我正在尝试在运行时简单加载一个用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类,因为它执行构造函数,但是handler的值始终为空。我错过了什么?或者我应该采取更好的方法吗?
5个回答

4
尝试直接将Activator.CreateInstance的结果设置为对象,而不进行转换。
可能FileReleaseHandler没有实现TestInterface.INeeedHelp,在这种情况下,通过"as TestInterface.INeeedHelp"将被设置为null。

确实。我的第一个想法是检查 Activator.CreateInstance(type) 是否返回了某些东西。然后弄清楚它应该是什么。 - ChrisF

4
< p > TestInterface.INeedHelp 的定义在哪里?一个常见的问题是,如果你在多个程序集中有相同的接口。如果调用方和动态加载的程序集都引用了同一个程序集中的同一个接口,那么应该没问题。

一个微妙的问题是,如果程序集与调用程序集位于不同的目录中,它可能会加载同一程序集的不同副本,这可能非常烦人 :(


这正是问题所在。我在每个项目中都定义了接口(一个是动态加载的dll,一个是调用的.exe),代码完全相同但位置不同。当我将接口拆分出来,并让调用的.exe和动态加载的dll引用相同的接口时,它就正常工作了。谢谢Jon,你帮了大忙。 - etoisarobot

1
检查已加载到应用程序域中的程序集。其中有两个程序集是否都包含 TestInterface.INeedHelp 接口?我的怀疑是 LoadFrom 将此创建的对象绑定到不同的 TestInterface.INeedHelp,而不是您尝试进行强制转换的那个接口。尝试进行普通向下转换,而不是所谓的“安全”转换,看看会得到什么错误。

0
问题在于LoadFrom方法将dll加载到“LoadFrom”上下文中,该上下文与默认上下文不同。此上下文中类型解析的规则与您所熟悉的规则不同。可能导致从运行时角度定义的主模块中的INeedHelp接口与来自LoadFrom上下文的同名接口不同。这将导致强制转换(作为TestInterface)返回null。
要查看是否存在此情况,请尝试将结果分配给对象。

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接