0

我正在尝试在运行时加载和使用 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 时,结果为空。知道为什么吗?

4

2 回答 2

0

我做了类似的事情:

private readonly Type _pluginbaseType = typeof(BasePlugin);

public AssemblyPlugin(Assembly assembly)
{

    Type[] _plugins = _assembly.GetExportedTypes()
        .Where(t => t.BaseType.IsSubclassOf(_pluginbaseType)
        .ToArray();
}

在此之后,您可以:

BasePlugin plugin = (BasePlugin)Activator.CreateInstance(pluginType);

您应该更喜欢基类而不是接口。

于 2012-09-14T18:07:12.277 回答
0

虽然我不明白,但谜题解决了。

定义接口 (SDK.dll) 的 DLL 也在被检查的范围之内。我在查询中手动删除了它,现在所有炒锅都按预期删除了。这是我的最终代码:

    var plugins =
        from fi in di.GetFiles("*.dll").Where(p => p.Name.ToUpper() != "SDK.DLL")
        let asm = Assembly.LoadFrom(fi.FullName)
        from t in asm.GetExportedTypes()
        where t.GetInterface(typeof(iPluggin).Name) != null
        select asm.CreateInstance(t.FullName, true) as iPluggin;
    Project.ProcessList.AddRange(plugins);
于 2012-09-14T18:37:41.053 回答