MSIL - 给定一个整数,调用操作码如何知道调用什么方法

hal*_*ton 5 c# clr cil

我试图弄清楚 MSIL 如何能够通过仅存储一个整数来表示对静态函数的调用。

例如,如果您添加对 Interlocked.Increment(ref someVariable) 的调用,您的 IL 将包含以下内容:

0x28 | 0x12、0x0、0x0、0xA

管道运算符是我的补充,本质上 0x28 是调用指令,而 012, 0x0, 0x0, 0xA 是“Interlocked.Increment”方法。

谁决定了这个价值?当您使用 ildasm 进行反汇编时,它会很好地打印名称,但是否有它查找的表?

这个表是在哪里定义的?

Ill*_*ack 4

根据 ECMA-335,0x0A000012 是元数据令牌。元数据令牌基本上是唯一标识本地模块中的类型、方法、字段等的数字。0x0A代表模块中的MemberRef表,0x12是表中方法的索引。

该表包含方法的名称和签名(如其参数和返回类型)。