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