如何解析IL字节中的方法调用?

问题描述 投票:0回答:1

我知道如何使用

System.Reflection
API,但不知道如何解析 IL(中间语言),尽管我确实知道如何解析 x86 操作码的价值。

现在我想找到程序集中调用给定方法的所有方法 - 例如,给定一个名为

Namespace.Classname.Methodname
的方法,程序集中的哪些方法调用它?

假设我有相关方法的

MethodInfo

为此,我想我必须解析从 MethodBody.GetILAsByteArray 方法返回的字节(我不知道该怎么做)。

API 帮助中的注释说,

解析方法体需要透彻理解元数据和MSIL指令格式。可以在公共语言基础设施 (CLI) 文档中找到信息,特别是“第二部分:元数据定义和语义”。

...这是一份 500 页的文档。

您能否给我任何关于如何执行此操作的提示,概述我将实现的算法,建议使用 ILSpy 等工具或库来执行此操作的简单方法,或者在我开始涉足之前参考该主题的合适介绍参考手册?

如果有帮助的话,我不想解析 IL 中的所有内容——只想解析它以找到方法调用,尤其是对构造函数的调用。

disassembly system.reflection cil
1个回答
0
投票

IL 字节流可以使用

System.Reflection.Emit.OpCodes
类进行解析。操作码
OperandType
字段告诉您要读取多少字节才能到达下一个操作码。在迭代流时,可以使用
Module.ResolveMember
方法解析元数据标记。请查看此处有关如何查找属性 getter 标记的示例:使用反射查找所有属性引用。该代码可以轻松调整以搜索您感兴趣的任何类型的令牌或指令。

© www.soinside.com 2019 - 2024. All rights reserved.