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

本文关键字:情况下 检查 NET 程序集 反射的 | 更新日期: 2023-09-27 18:18:15

假设我们有类 BaseDerived ,分别在 Base.dllDerived.dll 中定义。 Derived派生自Base(虽然可能不是直接的子类(

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

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

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

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

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

要调查 .NET 程序集(类型、方法等(,您需要从元数据中获取它。 Roslyn这不是你要找的。

虽然这并不完全正确,因为 Roslyn 有两种类型的代码信息,一种是节点和令牌,另一种是符号。第一个不知道关系信息,但第二个知道。

无论如何,您可以通过多种方式做到这一点。我会写其中的两个。

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

    var allTypesDefinitaion = ModuleDefinition.ReadModule(assemblyPath).Types;
    
  2. 使用 CFF 资源管理器等工具调查相关的元数据表。(TypeDef''Ref(

相关文章: