我知道如何使用
System.Reflection
API,但不知道如何解析 IL(中间语言),尽管我确实知道如何解析 x86 操作码的价值。
现在我想找到程序集中调用给定方法的所有方法 - 例如,给定一个名为
Namespace.Classname.Methodname
的方法,程序集中的哪些方法调用它?
假设我有相关方法的
MethodInfo
。
为此,我想我必须解析从 MethodBody.GetILAsByteArray 方法返回的字节(我不知道该怎么做)。
API 帮助中的注释说,
解析方法体需要透彻理解元数据和MSIL指令格式。可以在公共语言基础设施 (CLI) 文档中找到信息,特别是“第二部分:元数据定义和语义”。
...这是一份 500 页的文档。
您能否给我任何关于如何执行此操作的提示,概述我将实现的算法,建议使用 ILSpy 等工具或库来执行此操作的简单方法,或者在我开始涉足之前参考该主题的合适介绍参考手册?
如果有帮助的话,我不想解析 IL 中的所有内容——只想解析它以找到方法调用,尤其是对构造函数的调用。
IL 字节流可以使用
System.Reflection.Emit.OpCodes
类进行解析。操作码 OperandType
字段告诉您要读取多少字节才能到达下一个操作码。在迭代流时,可以使用 Module.ResolveMember
方法解析元数据标记。请查看此处有关如何查找属性 getter 标记的示例:使用反射查找所有属性引用。该代码可以轻松调整以搜索您感兴趣的任何类型的令牌或指令。