__methodptr 在反编译的 C# 代码中

__methodptr in decompiled C# code

我正在使用 dotPeek 深入研究 C# 编译器的魔力,反编译代码中的某些内容引起了我的注意。我正在创建一个 Action<int> 实例并将其传递给 Start() 方法,编译器生成以下内容:

new Program().Start(new Action<int>((object) cDisplayClass1, __methodptr(<Main>b__0)));

我大致了解这里发生的事情,我唯一的问题是 __methodptr 是什么?确切地说,它来自哪里?是IL的吗? dotPeek 对它或包含它的程序集一无所知。 Google 也没有给出准确的答案,只有相同的代码片段,没有任何解释。

谢谢!

__methodptr对应IL指令ldftn,粗略的说ldftn将 "function pointer" 加载到计算堆栈上。这是一个示例:

反编译源:

   private static void Main(string[] args)
    {
      Program.\u003C\u003Ec__DisplayClass0_0 cDisplayClass00 = new Program.\u003C\u003Ec__DisplayClass0_0();
      cDisplayClass00.xx = 100;
      // ISSUE: method pointer
      new Action((object) cDisplayClass00, __methodptr(\u003CMain\u003Eb__0))();
      Console.WriteLine(cDisplayClass00.xx);
    }

IL:

1 加载函数指针class::method

IL_000f: ldloc.0      // cDisplayClass00
IL_0010: ldftn        instance void TestIL.Program/'<>c__DisplayClass0_0'::'<Main>b__0'()

2 new a delegate passing object and function pointer

IL_0016: newobj       instance void [mscorlib]System.Action::.ctor(object, native int)
IL_001b: stloc.1      // V_1

3 调用委托

IL_001c: ldloc.1      // V_1
IL_001d: callvirt     instance void [mscorlib]System.Action::Invoke()
IL_0022: nop 

您应该按如下方式替换代码:

新动作(cDisplayClass00.Mainb__0))();

可以说,自动生成的函数指针指向自动生成的方法class。