我试图弄清楚 MSIL 如何能够通过仅存储一个整数来表示对静态函数的调用。
例如,如果您添加对 Interlocked.Increment(ref someVariable) 的调用,您的 IL 将包含以下内容:
0x28 | 0x12、0x0、0x0、0xA
管道运算符是我的补充,本质上 0x28 是调用指令,而 012, 0x0, 0x0, 0xA 是“Interlocked.Increment”方法。
谁决定了这个价值?当您使用 ildasm 进行反汇编时,它会很好地打印名称,但是否有它查找的表?
这个表是在哪里定义的?
根据 ECMA-335,0x0A000012 是元数据令牌。元数据令牌基本上是唯一标识本地模块中的类型、方法、字段等的数字。0x0A代表模块中的MemberRef表,0x12是表中方法的索引。
该表包含方法的名称和签名(如其参数和返回类型)。