繁体   English   中英

如何使用C#加载程序集并在其中获取所有类型(无ReflectionTypeLoadException)

[英]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:测试。

  • 测试和dummy_assembly都引用Core。
  • Dummy_assembly是我压缩过的dll,正在尝试解压缩,加载然后搜索。
  • 测试是从中调用上面显示的方法的程序集。
  • 上面显示的代码位于Core中。

我看这个 看来这可能适用,但我无法完全说出具体方法(而且我不太理解为什么该答案适用于该问题)。

如果程序集包含无法加载的类型,则它将抛出(通常是因为在无法解析的程序集引用上)...对此无能为力。

但是您可以捕获异常并检查Types属性,并获取可以成功加载的类型。

https://msdn.microsoft.com/zh-cn/library/system.reflection.reflectiontypeloadexception.types(v=vs.110).aspx

如果您在另一个目录中引用了dll,则还可以处理AppDomain.AssemblyResolve事件并自己处理。

在gettypes代码周围添加一个try / catch块。 确保将日志记录到无法出于调试目的而加载程序集的位置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM