如何在不使用反射的情况下检查 .NET 程序集
How to examine .NET assembly without using reflection
比方说,我们有 class Base
和 Derived
,分别定义在 Base.dll
和 Derived.dll
中。 Derived
派生自 Base
(虽然可能不是直接子 class)
手头的问题是,如果我们手头有 Derived.dll
但缺少 Base.dll
,如何以编程方式检查 Derived
中的所有类型?例如了解可用的类型、它们的可访问性、继承关系等
根据我的理解,反射(System.Reflection
命名空间中的东西)在这里不是一个选项,因为 GetTypes()
将尝试加载不可用的 Base.dll
,因此抛出 ReflectionTypeLoadException
.
特别是,这是否可以使用 Roslyn
或一些好的库轻松实现?
为了研究 .NET 程序集(类型、方法等),您需要从元数据中获取它。 Roslyn
这不是您要查找的内容。
虽然不完全正确,因为Roslyn有两种关于你的代码的信息,一种是nodes和token,另一种是symbols。第一个不知道关系信息,但第二个知道。
无论如何,你可以通过不止一种方式来做到这一点。我会写两个。
使用 Mono.Cecil 打开您的程序集,获取主模块并调查您想要的任何内容。
var allTypesDefinitaion = ModuleDefinition.ReadModule(assemblyPath).Types;
使用 CFF Explorer 等工具调查相关元数据表。 (TypeDef\Ref)
您正在寻找 System.Reflection.Metadata,它直接公开程序集元数据,无需通过反射加载程序集。
比方说,我们有 class Base
和 Derived
,分别定义在 Base.dll
和 Derived.dll
中。 Derived
派生自 Base
(虽然可能不是直接子 class)
手头的问题是,如果我们手头有 Derived.dll
但缺少 Base.dll
,如何以编程方式检查 Derived
中的所有类型?例如了解可用的类型、它们的可访问性、继承关系等
根据我的理解,反射(System.Reflection
命名空间中的东西)在这里不是一个选项,因为 GetTypes()
将尝试加载不可用的 Base.dll
,因此抛出 ReflectionTypeLoadException
.
特别是,这是否可以使用 Roslyn
或一些好的库轻松实现?
为了研究 .NET 程序集(类型、方法等),您需要从元数据中获取它。 Roslyn
这不是您要查找的内容。
虽然不完全正确,因为Roslyn有两种关于你的代码的信息,一种是nodes和token,另一种是symbols。第一个不知道关系信息,但第二个知道。
无论如何,你可以通过不止一种方式来做到这一点。我会写两个。
使用 Mono.Cecil 打开您的程序集,获取主模块并调查您想要的任何内容。
var allTypesDefinitaion = ModuleDefinition.ReadModule(assemblyPath).Types;
使用 CFF Explorer 等工具调查相关元数据表。 (TypeDef\Ref)
您正在寻找 System.Reflection.Metadata,它直接公开程序集元数据,无需通过反射加载程序集。