gpt4 book ai didi

c# - 用于数组传递和返回的 Microsoft 中间语言代码 [MSIL]

转载 作者:行者123 更新时间:2023-12-02 15:48:37 25 4
gpt4 key购买 nike

我使用带有签名的 MethodBuilder 创建了一个动态方法 Int32[] Exp(Int32[])

发出的代码如下

Type[] myMthdParams = new Type[1];
myMthdParams[index] = typeof(int[]);
MethodBuilder myMthdBld = myTypeBld.DefineMethod("Exp",MethodAttributes.Public |MethodAttributes.Static, typeof(int[]),mthdParams);
ILGenerator ILout = myMthdBld.GetILGenerator();
ILout.Emit(OpCodes.Ldarg_1);
ILout.Emit(OpCodes.Stloc_0);
ILout.Emit(OpCodes.Ldloc_0);
ILout.Emit(OpCodes.Ret);

我要实现的方法如下:

int[] Exp(int[] arr)
{
return arr;
}

我收到错误 CLR 检测到无效程序。我到底做错了什么??非常感谢任何帮助。

最佳答案

STLocldloc 存储到第一个本地,然后从第一个本地加载。这有点像你的代码:

int[] Exp(int[] arr)
{
var temp = arr;
return temp;
}

但是如果您没有使用 DeclareLocal() 定义 temp 那么它更像是:

int[] Exp(int[] arr)
{
temp = arr;
return temp;
}

这当然是无效的(没有 temp 的定义)。

无论如何,您都不需要这个临时本地文件(尽管 C# 的调试编译通常会包含它们以帮助调试)。为什么不只是:

ILGenerator ILout = myMthdBld.GetILGenerator();
ILout.Emit(OpCodes.Ldarg_1);
ILout.Emit(OpCodes.Ret);

或者如果该方法是静态的(因此没有 this 作为第一个参数):

ILGenerator ILout = myMthdBld.GetILGenerator();
ILout.Emit(OpCodes.Ldarg_0);
ILout.Emit(OpCodes.Ret);

关于c# - 用于数组传递和返回的 Microsoft 中间语言代码 [MSIL],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38011807/

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