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

How to examine .NET assembly without using reflection

比方说,我们有 class BaseDerived,分别定义在 Base.dllDerived.dll 中。 Derived 派生自 Base(虽然可能不是直接子 class)

手头的问题是,如果我们手头有 Derived.dll 但缺少 Base.dll,如何以编程方式检查 Derived 中的所有类型?例如了解可用的类型、它们的可访问性、继承关系等

根据我的理解,反射(System.Reflection 命名空间中的东西)在这里不是一个选项,因为 GetTypes() 将尝试加载不可用的 Base.dll,因此抛出 ReflectionTypeLoadException.

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

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

虽然不完全正确,因为Roslyn有两种关于你的代码的信息,一种是nodes和token,另一种是symbols。第一个不知道关系信息,但第二个知道。

无论如何,你可以通过不止一种方式来做到这一点。我会写两个。

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

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

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