调用不带参数的方法的 IL 代码

IL code to call method with out parameter

我想 IL 生成动态方法

delegate ArraySegment<byte> X(MyClass mc);

调用 mc 和 returns 其 out 参数上的签名方法。

MethodInfo methInf = aClass.GetMethod("Y",
    BindingFlags.Public | BindingFlags.Instance, 
    null, new[] { typeof(ArraySegment<byte>).MakeByRefType() }, null);

但是我不知道如何处理out参数。这是我目前的代码。

DynamicMethod dm = new DynamicMethod("X", typeof(ArraySegment<byte>),
                                     new[] { typeof(MyClass) });
ILGenerator il = dm.GetILGenerator();

il.Emit(OpCodes.Ldarg_0);
il.EmitCall(OpCodes.Callvirt, methInf, null);

要使 out 参数起作用,需要什么?

感谢@MarcGravell(也感谢您删除的答案,这非常有帮助,因为它阐明了您在对我的问题的评论中暗示的内容)和ILSpy,它通过编译 c# 代码帮助了我到 CIL,所以我可以偷看一下。

所以这是最终的工作代码:

LocalBuilder local = il.DeclareLocal(typeof(ArraySegment<byte>));
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldloca, local);
il.EmitCall(OpCodes.Callvirt, methInf, null);
il.Emit(OpCodes.Pop);
il.Emit(OpCodes.Ldloc, local.LocalIndex);
il.Emit(OpCodes.Ret);

调用它比 methodInfo.Invoke(...) 快 10 倍(当然,在只创建一次的 methodInfo 对象上)。