【问题标题】:How to load an assembly and get all types in it with C# (without ReflectionTypeLoadException)如何使用 C# 加载程序集并获取其中的所有类型(没有 ReflectionTypeLoadException)
【发布时间】: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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 自己处理会是什么样子?
    【解决方案2】:

    在 gettypes 代码周围添加一个 try/catch 块。确保在无法加载程序集的地方记录以进行调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-04
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多