gpt4 book ai didi

c# - MSIL 存储要返回的结构值

转载 作者:行者123 更新时间:2023-11-30 21:57:04 25 4
gpt4 key购买 nike

我正在使用 RemotingLite 库 ( see at github ) 并且 Proxy 类工厂有问题。简而言之,问题是在生成代码以返回 ValueType 对象(如用户定义的结构)时。

部分原代码:

...
mIL.Emit(OpCodes.Ldloc, resultLB.LocalIndex); //load the result array
mIL.Emit(OpCodes.Ldc_I4, 0); //load the index of the return value. Alway 0
mIL.Emit(OpCodes.Ldelem_Ref); //load the value in the index of the array

if (returnType.IsValueType)
{
mIL.Emit(OpCodes.Unbox, returnType); //unbox it
mIL.Emit(ldindOpCodeTypeMap[returnType]);
}
else
mIL.Emit(OpCodes.Castclass, returnType);
}
mIL.Emit(OpCodes.Ret);

ldindOpCodeTypeMap 是一个字典,其中包含 OpCodes.Ldind_U2 等操作码。因此它仅适用于标准 MSIL 类型,如 Int16、Int32 等。但是,如果我需要压入堆栈然后返回自定义 ValueType 值(例如 - Guid - 大小为 16 字节),我需要做什么?

例如:

...
mIL.Emit(OpCodes.Unbox, returnType); //unbox it
OpCode opcode;
if (ldindOpCodeTypeMap.TryGetValue(returnType, out opcode))
{
mIL.Emit(ldindOpCodeTypeMap[returnType]);
}
else
{
// here I getting the size of custom type
var size = System.Runtime.InteropServices.Marshal.SizeOf(returnType);
// what next?
}
...

在这里,我得到了自定义 ValueType 值的大小。那么如何像 Ldind_x 操作码那样将自定义 ValueType 的值间接加载到评估堆栈上呢?谢谢!

最佳答案

Ldobj 会做你想做的事。但您也可以将整个条件替换为 Unbox_Any:它将为值类型或引用类型完成您需要的一切。

您发布的代码的完全替换将是:

...
mIL.Emit(OpCodes.Ldloc, resultLB.LocalIndex); //load the result array
mIL.Emit(OpCodes.Ldc_I4, 0); //load the index of the return value. Alway 0
mIL.Emit(OpCodes.Ldelem_Ref); //load the value in the index of the array

mIL.Emit(OpCodes.Unbox_Any, returnType);
mIL.Emit(OpCodes.Ret);

关于c# - MSIL 存储要返回的结构值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30967286/

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