我使用带有签名的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检测到无效程序。 我做错了什么? 非常感谢任何帮助。
答案 0 :(得分:5)
//creating the line with 2 points
line l = new line(
new point() { x = 0, y = 0 },
new point() { x = 9, y = 9 }
);
List<line> result = l.SplitLine(3);
和stloc
存储到第一个本地然后加载。这有点像你的代码:
ldloc
但如果你还没有使用int[] Exp(int[] arr)
{
var temp = arr;
return temp;
}
定义temp
,那么它更像是:
DeclareLocal()
当然无效(没有int[] Exp(int[] arr)
{
temp = arr;
return temp;
}
的定义)。
无论如何你都不需要这个临时本地(尽管C#的调试编译通常会包含它们以帮助调试)。为什么不呢:
temp
或者,如果方法是静态的(因此没有ILGenerator ILout = myMthdBld.GetILGenerator();
ILout.Emit(OpCodes.Ldarg_1);
ILout.Emit(OpCodes.Ret);
作为第一个参数):
this