用于数组传递和 return 的 Microsoft 中间语言代码 [MSIL]

Microsoft intermediate language code [MSIL] for array passing and return

我使用带有签名的 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);