我正在尝试在运行时加载和使用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时,结果为null。 知道为什么吗?
答案 0 :(得分: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);
您应该更喜欢基类而不是接口。
答案 1 :(得分:0)
麻烦解决了,我不明白。
定义de interface(SDK.dll)的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);