调用不带参数的方法的 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
对象上)。
我想 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
对象上)。