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

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

最佳答案

STLocldloc 存储到第一个本地,然后从第一个本地加载。这有点像你的代码:

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/

相关文章:

c# - Nullable<int> 是 "Predefined value type"- 或者 Equals() 和 == 在这里如何工作?

c# - COM 和线程安全

c# - VB.NET 中是否有锁定语句?

c# - 使用 Owin 的 Twitter 外部登录给出 HTTP 403(禁止)

f# - F# 如何将可以将多种不同参数类型带入 IL 的函数编译?

.net - 如何导出 CIL DLL 中的方法以便 native 程序可以调用它?

c# - 为什么 C# -> CIL 在每条指令上都有一个标签?

c# - asp 中继器复选框状态保留

CIL指令 "isinst <valuetype>"

f# - 是否可以强制 .NET F# 编译器在模块中生成 CIL 字段?