繁体   English   中英

反编译的 C# 代码中的 __methodptr

[英]__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 对它或包含它的程序集一无所知。 谷歌也没有给出准确的答案,只有相同的代码片段,没有任何解释。

谢谢!

__methodptr对应于 IL 指令ldftn ,粗略地说ldftn 将“函数指针”加载到评估堆栈上。 这是一个示例:

反编译的源代码:

   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 加载函数指针类::方法

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

2 新的委托传递对象和函数指针

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))();

可以这么说,函数指针指向自动生成类上的自动生成方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM