我想让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起作用需要什么?
答案 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
对象上)。