我使用带有签名Int32 [] Exp(Int32 [])的MethodBuilder创建了一个动态方法
发出的代码如下
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);
Run Code Online (Sandbox Code Playgroud)
我想实现的方法如下:
int[] Exp(int[] arr)
{
return arr;
}
Run Code Online (Sandbox Code Playgroud)
我收到错误CLR检测到无效程序.我做错了什么?非常感谢任何帮助.
在stloc与ldloc来自第一本地存储到,然后加载.这有点像你的代码:
int[] Exp(int[] arr)
{
var temp = arr;
return temp;
}
Run Code Online (Sandbox Code Playgroud)
但如果你没有定义temp使用DeclareLocal()那么它更像是:
int[] Exp(int[] arr)
{
temp = arr;
return temp;
}
Run Code Online (Sandbox Code Playgroud)
这当然是无效的(没有定义temp).
无论如何,您不需要这个临时本地(尽管C#的调试编译通常会包含它们以帮助调试).为什么不呢:
ILGenerator ILout = myMthdBld.GetILGenerator();
ILout.Emit(OpCodes.Ldarg_1);
ILout.Emit(OpCodes.Ret);
Run Code Online (Sandbox Code Playgroud)
或者,如果方法是静态的(因此没有this作为第一个参数):
ILGenerator ILout = myMthdBld.GetILGenerator();
ILout.Emit(OpCodes.Ldarg_0);
ILout.Emit(OpCodes.Ret);
Run Code Online (Sandbox Code Playgroud)