TL; DR: 什么是Prefixref?可以用参数/指令长度来发挥作用吗?
我最近一直在研究.NET二进制解析工具,当我在mscorlib的位上测试我的库时,我开始得到一些奇怪的异常,其中IL没有表现(分支到参数!)。我已经调查并将我的问题跟踪到System.Random.InternalSample(一个没有出现在ildasm中的方法)。我已经对我的二进制分析器进行了gerryrigged以生成类似ILDASM的输出,以下是它为这个神秘函数生成的内容(注释是手动添加的)。
我无法弄清楚的是IL_0044
发生的事情。这条指令似乎分支到另一个操作的中间!要么我正在阅读CIL非常错误,这里有一些非常奇怪的事情,或者那些令人讨厌的前缀指令令人困惑。有谁知道什么是prefixref?文档只是说它是保留的,并且“不打算直接在你的代码中使用。”
.maxstack 3
.locals init ( [0] System.Int32 V_0,
[1] System.Int32 V_1,
[2] System.Int32 V_2)
IL_0000: ldarg_0
IL_0001: ldfld 0xB5 0x05 0x00 0x04
IL_0006: stloc_1
IL_0007: ldarg_0
IL_0008: ldfld 0xB6 0x05 0x00 0x04
IL_000D: stloc_2
IL_000E: ldloc_1
IL_000F: ldc_i4_1
IL_0010: add
IL_0011: dup
IL_0012: stloc_1
IL_0013: ldc_i4_s 0x38
IL_0015: blt_s 0x02 // IL_0019
IL_0017: ldc_i4_1
IL_0018: stloc_1
IL_0019: ldloc_2
IL_001A: ldc_i4_1
IL_001B: add
IL_001C: dup
IL_001D: stloc_2
IL_001E: ldc_i4_s 0x38
IL_0020: blt_s 0x02 // IL_0024
IL_0022: ldc_i4_1
IL_0023: stloc_2
IL_0024: ldarg_0
IL_0025: ldfld 0xB7 0x05 0x00 0x04
IL_002A: ldloc_1
IL_002B: ldelem_i4
IL_002C: ldarg_0
IL_002D: ldfld 0xB7 0x05 0x00 0x04
IL_0032: ldloc_2
IL_0033: ldelem_i4
IL_0034: sub
IL_0035: stloc_0
IL_0036: ldloc_0
IL_0037: ldc_i4_m1
IL_0038: prefixref
IL_0039: prefixref
IL_003A: prefixref
IL_003B: ldsflda 0x33 0x04 0x06 0x17
IL_0040: sub
IL_0041: stloc_0
IL_0042: ldloc_0
IL_0043: ldc_i4_0
IL_0044: bge_s 0x08 // IL_004B + 0x03
IL_0046: ldloc_0
IL_0047: ldc_i4_m1
IL_0048: prefixref
IL_0049: prefixref
IL_004A: prefixref
IL_004B: ldsflda 0x58 0x0A 0x02 0x7B
IL_0050: conv_ovf_i4
IL_0051: ldarg_3
IL_0052: nop
IL_0053: ldarg_2
IL_0054: ldloc_1
IL_0055: ldloc_0
IL_0056: stelem_i4
IL_0057: ldarg_0
IL_0058: ldloc_1
IL_0059: stfld 0xB5 0x05 0x00 0x04
IL_005E: ldarg_0
IL_005F: ldloc_2
IL_0060: stfld 0xB6 0x05 0x00 0x04
IL_0065: ldloc_0
IL_0066: ret