gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 14:48:00 26 4
gpt4 key购买 nike

我想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 参数起作用,需要什么?

最佳答案

感谢@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 对象上)。

关于c# - 调用不带参数的方法的 IL 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53271752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com