我们说,我们分别在Base
和Derived
中定义了课程Base.dll
和Derived.dll
。 Derived
派生自Base
(可能不是直接的子类)
目前的问题是,如果我们手头有Derived.dll
但Base.dll
缺失,那么如何以编程方式检查Derived
中的所有类型?例如了解可用的类型,可访问性,继承关系等
根据我的理解,反射(System.Reflection
命名空间中的内容)不是一个选项,因为GetTypes()
将尝试加载不可用的Base.dll
,因此抛出{{1} }。
特别是,使用ReflectionTypeLoadException
或一些好的库可以轻松实现这一点吗?
答案 0 :(得分:2)
您正在寻找直接公开程序集元数据的System.Reflection.Metadata,而无需通过反射加载程序集。
答案 1 :(得分:1)
为了研究.NET程序集(类型,方法等),您需要从元数据中获取它。 Roslyn
它不是你想要的。
虽然事实并非如此,因为Roslyn有两种类型的代码信息,一种是节点和令牌,另一种是符号。第一个不知道关系信息,但第二个知道。
无论如何,你可以通过多种方式实现这一目标。我会写两个。
使用Mono.Cecil打开您的程序集,获取主模块并调查您想要的任何内容。
var allTypesDefinitaion = ModuleDefinition.ReadModule(assemblyPath).Types;
使用CFF Explorer等工具调查相关的元数据表。 (的TypeDef \ REF)