【发布时间】:2012-09-14 17:54:29
【问题描述】:
我正在尝试在运行时加载和使用 DLL,这工作正常:
var pluggin = asm2.CreateInstance("ParserTest.Interface", true) as iPluggin;
但这没有(我需要遍历特定文件夹中的 DLL 文件以找到实现 iPluggin 接口的正确文件):
...
var asm = Assembly.LoadFrom(dll.FullName);
if (asm.GetExportedTypes().FirstOrDefault(q => q.GetInterface(tName) != null) == null) continue;
Project.ProcessList.Add(asm.CreateInstance(tName, true) as iPluggin);
...
在调试模式下做一些研究发现:
asm.CreateInstance(tName, true)
返回正确的对象,但是当尝试将其转换为 iPluggin 时,结果为空。 知道为什么吗?
【问题讨论】:
-
因为它返回一个不兼容类型的对象 (?)。
-
CreateInstance 按预期返回一个 System.Object,我看到的有效代码和无效代码之间的唯一区别是我手动提供了接口名称(“ParserTest.Interface”)第一种情况
-
as在转换失败时返回 null 而不是引发异常,正如 Ondrej 所说。 -
是的,但是如果它没有实现那个接口,“as”返回null。那么:该接口在哪里声明?
-
@FranCasadome 然后看起来你以某种方式加载了两次声明
iPluggin的程序集。您是否尝试过重新编译所有内容?你不是从一个陌生的地方加载那个程序集吗,或者类似的东西?
标签: c# .net-assembly