IL代码调用带参数的方法

时间:2018-11-12 23:48:46

标签: c# cil emit out-parameters ilgenerator

我想让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);

要使out param起作用需要什么?

1 个答案:

答案 0 :(得分: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);

调用methodInfo.Invoke(...)的速度比methodInfo快10倍(当然,在仅创建一次的for pair in word_list_pet_image: for word in pair: if word.isalpha(): #append to list 对象上)。