[英]__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.