gpt4 book ai didi

c# - 反射发出堆栈和方法调用

转载 作者:太空狗 更新时间:2023-10-29 22:23:12 30 4
gpt4 key购买 nike

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

我有一个很简单的方法

public static void Execute(string 1, string 2)

我想动态生成下面类中的方法(其他的算了,我都整理好了)

public class Test{
public string s1;

public void Run(string s2)
{
MyOtherClass.Execute(s2,s1)
}
}

我有一份上述测试的副本,以供引用,我注意到在“调用”之前发出了以下操作码。

  1. ldarg_1
  2. ldarg_0
  3. 低频

问题是 ldarg_0 在那里做什么?我只需要 2 个调用参数,为什么 CLR 要求将 ldarg_0 压入堆栈?

最佳答案

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
}

关于c# - 反射发出堆栈和方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14270309/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com