【发布时间】:2016-12-05 08:49:01
【问题描述】:
我正在尝试构建一个插件架构,其中 dll 包含在一个 zip 文件中,解压缩,存储,然后加载,以便可以构建和使用特定类型。从理论上讲,这听起来是可行的。但我有一个问题。我一直收到一个
ReflectionTypeLoadException。
这是我所拥有的不起作用的:
var dlls = pluginFiles.Where(p => p.Value.FileInfo.Extension.ToLower() == ".dll").ToList();
int num = 0;
foreach(var dll in dlls){
var assembly = Assembly.LoadFile (dll.Value.FileInfo.FullName);
var pluginTypes = assembly.GetTypes().Where (p => p.IsSubclassOf (typeof (Plugin)));
foreach(var pluginType in pluginTypes){
var ctor = pluginType.GetConstructors ().FirstOrDefault ();
if (ctor == null) continue;
var plugin = (Plugin)ctor.Invoke (new object [] { });
if (plugin == null) continue;
num++;
_mgr.RegisterNew (plugin);
}
}
当我在调试中逐步执行此操作时,异常发生在我正在运行 assembly.GetTypes() 的行上。
我在这里做错了什么?我应该用新的 AppDomain 做点什么吗?
更多信息:我正在加载的程序集是一个测试程序集。它确实引用了 FakeItEasy。它有一个类,这是我正在寻找的类。该特定类是另一个类的子类,该类位于我的调用类引用的程序集中……这看起来令人困惑。让我这样解释:
程序集 1:核心,程序集 2:虚拟程序集,程序集 3:测试。
- Tests 和 dummy_assembly 均参考 Core。
- Dummy_assembly 是一个 dll,我已压缩并尝试解压缩、加载和搜索。
- Tests 是我从中调用上述方法的程序集。
- 上面显示的代码位于 Core 中。
我看过this。似乎它可能适用,但我无法完全说明如何(而且我不太明白为什么该答案适用于该问题)。
【问题讨论】:
标签: c# exception reflection types .net-assembly