我试图构建一个插件体系结构,其中的dll包含在zip文件中,解压缩,存储,然后加载,以便特定类型可以被构建和使用。理论上,这听起来可行。但是我遇到了问题。我不断收到如何使用C#加载程序集并获取其中的所有类型(不包含ReflectionTypeLoadException)
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:Dummy_assembly,装配3:测试。
- 测试和dummy_assembly参考核心。
- Dummy_assembly是我压缩并试图解压,加载,然后搜索的dll。
- 测试是我调用上面显示的方法的程序集。
- 上面显示的代码位于Core中。
我看了看this。它似乎可能适用,但我不能完全说明(我不太明白为什么这个答案适用于这个问题)。
什么会处理它自己看起来像? –
https://msdn.microsoft.com/zh-cn/library/ff527268(v=vs.110).aspx – Jeff