反射发出堆栈和方法调用

Alw*_*wyn 5 .net c# reflection reflection.emit

有人可以向我解释在通过reflection.emit进行函数调用之前需要加载到堆栈中的内容吗?

我有一个非常简单的方法

public static void Execute(string 1, string 2)
Run Code Online (Sandbox Code Playgroud)

我想动态生成下面的类中的方法(忘记其余的,我把它们整理出来)

public class Test{
    public string s1;

    public void Run(string s2)
    {
        MyOtherClass.Execute(s2,s1)
    }
}
Run Code Online (Sandbox Code Playgroud)

我有上述测试的副本供参考,我注意到在"调用"之前发出了以下操作码.

  1. ldarg_1
  2. ldarg_0
  3. ldfld

问题是ldarg_0在那里做什么?我只需要2个参数用于调用,为什么CLR需要将ldarg_0推送到堆栈?

Dan*_*ner 9

arg.0包含this并且需要通过ldfld string Test:s1推入this.s1堆栈.

.method public hidebysig instance void Run(string s2) cil managed
{
    .maxstack 8                                      // maximum stack size 8
    ldarg.1                                          // push argument s2
    ldarg.0                                          // push this
    ldfld string Test::s1                            // pop this, push this.s1
    call void MyOtherClass::Execute(string, string)  // call
    ret                                              // return
}
Run Code Online (Sandbox Code Playgroud)