C# 为IL生成中的方法调用将局部变量加载到堆栈中?

C# 为IL生成中的方法调用将局部变量加载到堆栈中?,c#,reflection,reflection.emit,il,C#,Reflection,Reflection.emit,Il,我试图生成IL来模拟以下方法MyMethod: public void DoSomething(object a, object b, string c, string d){...}; public virtual void MyMethod(object a, object b) { DoSomething(a, b, "hello", this.SomeInstanceString); } 到目前为止,我已经知道了这一点,但我无法理解如何将第3个和第4个参数加载到堆栈中以调用D

我试图生成IL来模拟以下方法
MyMethod

public void DoSomething(object a, object b, string c, string d){...};
public virtual void MyMethod(object a, object b) 
{
    DoSomething(a, b, "hello", this.SomeInstanceString);
}
到目前为止,我已经知道了这一点,但我无法理解如何将第3个和第4个参数加载到堆栈中以调用
DoSomething(a,b,“hello”,This.SomeInstanceString))


那么,如何将字符串
“hello”
和本地实例变量
this.SomeInstanceString
加载到堆栈中以调用
DoSomething

加载字符串文本相当容易

myMethodILGen.Emit(OpCodes.Ldstr, "hello");
从对象实例加载字段需要首先将对象实例加载到堆栈上,然后使用Ldfld操作码。您应该已经为SomeInstanceString字段准备了一个FieldBuilder,可以用于此

FieldBuilder fieldBuilder = typeBuilder.DefineField(
                    "SomeInstanceString",
                    typeof(string),
                    FieldAttributes.Public);

myMethodILGen.Emit(OpCodes.Ldarg_0);
myMethodILGen.Emit(OpCodes.Ldfld, fieldBuilder);

另外,请记住,Ldarg_0并没有做您认为它做的事情。实例方法有一个隐式参数,该参数位于零槽中,该槽包含该方法当前在其中操作的实例。这就是为什么我们使用Ldarg_0来取消对字段的引用,因为您可能想要该方法所在的实例。但是,这不适用于静态方法。

加载字符串文本相当容易

myMethodILGen.Emit(OpCodes.Ldstr, "hello");
从对象实例加载字段需要首先将对象实例加载到堆栈上,然后使用Ldfld操作码。您应该已经为SomeInstanceString字段准备了一个FieldBuilder,可以用于此

FieldBuilder fieldBuilder = typeBuilder.DefineField(
                    "SomeInstanceString",
                    typeof(string),
                    FieldAttributes.Public);

myMethodILGen.Emit(OpCodes.Ldarg_0);
myMethodILGen.Emit(OpCodes.Ldfld, fieldBuilder);

另外,请记住,Ldarg_0并没有做您认为它做的事情。实例方法有一个隐式参数,该参数位于零槽中,该槽包含该方法当前在其中操作的实例。这就是为什么我们使用Ldarg_0来取消对字段的引用,因为您可能想要该方法所在的实例。但是,这不适用于静态方法。

是的,实际上我有一个字段生成器。“我在看《伊尔达斯姆》中的《伊尔达斯姆》,果然你的钱是对的。”迈克:很高兴听到这个消息。Ildasm将对您非常有用。我还建议使用PEVerify来确保生成的程序集格式良好。PEVerify花了我最后一英里的时间来修复我的IL生成中出现的其他问题。非常感谢,这非常有帮助。是的,我有一个字段生成器。“我在看《伊尔达斯姆》中的《伊尔达斯姆》,果然你的钱是对的。”迈克:很高兴听到这个消息。Ildasm将对您非常有用。我还建议使用PEVerify来确保生成的程序集格式良好。PEVerify花了我最后一英里的时间来修复我的IL生成中出现的其他问题。非常感谢,这很有帮助。