如何在不使用反射的情况下检查.NET程序集

时间:2016-11-17 08:10:07

标签: c# .net dll reflection roslyn

我们说,我们分别在BaseDerived中定义了课程Base.dllDerived.dllDerived派生自Base(可能不是直接的子类)

目前的问题是,如果我们手头有Derived.dllBase.dll缺失,那么如何以编程方式检查Derived中的所有类型?例如了解可用的类型,可访问性,继承关系等

根据我的理解,反射(System.Reflection命名空间中的内容)不是一个选项,因为GetTypes()将尝试加载不可用的Base.dll,因此抛出{{1} }。

特别是,使用ReflectionTypeLoadException或一些好的库可以轻松实现这一点吗?

2 个答案:

答案 0 :(得分:2)

您正在寻找直接公开程序集元数据的System.Reflection.Metadata,而无需通过反射加载程序集。

答案 1 :(得分:1)

为了研究.NET程序集(类型,方法等),您需要从元数据中获取它。 Roslyn它不是你想要的。

虽然事实并非如此,因为Roslyn有两种类型的代码信息,一种是节点和令牌,另一种是符号。第一个不知道关系信息,但第二个知道。

无论如何,你可以通过多种方式实现这一目标。我会写两个。

  1. 使用Mono.Cecil打开您的程序集,获取主模块并调查您想要的任何内容。

    var allTypesDefinitaion = ModuleDefinition.ReadModule(assemblyPath).Types;
    
  2. 使用CFF Explorer等工具调查相关的元数据表。 (的TypeDef \ REF)