![](/img/trans.png)
[英]C# set accessor accessible to all types in assembly, and get assessor only to derivated types. How to?
[英]How to load an assembly and get all types in it with C# (without ReflectionTypeLoadException)
我正在尝试构建一个插件架构,在其中将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:测试。
我看这个 。 看来这可能适用,但我无法完全说出具体方法(而且我不太理解为什么该答案适用于该问题)。
如果程序集包含无法加载的类型,则它将抛出(通常是因为在无法解析的程序集引用上)...对此无能为力。
但是您可以捕获异常并检查Types属性,并获取可以成功加载的类型。
如果您在另一个目录中引用了dll,则还可以处理AppDomain.AssemblyResolve事件并自己处理。
在gettypes代码周围添加一个try / catch块。 确保将日志记录到无法出于调试目的而加载程序集的位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.