如何在不使用反射的情况下检查 .NET 程序集
本文关键字:情况下 检查 NET 程序集 反射的 | 更新日期: 2023-09-27 18:18:15
假设我们有类 Base
和 Derived
,分别在 Base.dll
和 Derived.dll
中定义。 Derived
派生自Base
(虽然可能不是直接的子类(
头的问题是,如果我们手头有Derived.dll
但缺少Base.dll
,如何以编程方式检查Derived
中的所有类型?例如,知道哪些类型可用,它们的可访问性,继承关系等
根据我的理解,反射(命名空间中的东西(在这里不是一个选项System.Reflection
因为GetTypes()
会尝试加载不可用Base.dll
,从而抛出ReflectionTypeLoadException
。
特别是,这是可以使用Roslyn
或一些好的库轻松实现的吗?
您正在寻找 System.Reflection.Metadata,它直接公开程序集元数据,而无需通过反射加载程序集。
要调查 .NET 程序集(类型、方法等(,您需要从元数据中获取它。 Roslyn
这不是你要找的。
虽然这并不完全正确,因为 Roslyn 有两种类型的代码信息,一种是节点和令牌,另一种是符号。第一个不知道关系信息,但第二个知道。
无论如何,您可以通过多种方式做到这一点。我会写其中的两个。
-
使用Mono.Cecil打开你的程序集,获取主模块并调查你想要的任何内容。
var allTypesDefinitaion = ModuleDefinition.ReadModule(assemblyPath).Types;
-
使用 CFF 资源管理器等工具调查相关的元数据表。(TypeDef''Ref(