2

我想 IL 生成一个动态方法

delegate ArraySegment<byte> X(MyClass mc);

调用签名的方法mc并返回其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);

需要什么才能使输出参数起作用?

4

1 回答 1

0

感谢@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);

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

于 2018-11-13T00:56:38.643 回答