我使用带有签名的 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 检测到无效程序。 我到底做错了什么?? 非常感谢任何帮助。
最佳答案
STLoc
和 ldloc
存储到第一个本地,然后从第一个本地加载。这有点像你的代码:
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/