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

时间:2016-06-24 10:59:25

标签: c# cil

我使用带有签名的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检测到无效程序。 我做错了什么? 非常感谢任何帮助。

1 个答案:

答案 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