小编bad*_*ari的帖子

在IL Emit中将对象添加到循环列表中 - 公共语言运行时检测到无效程序

以下是我的C#代码:

List<int> list = new List<int>();
for(int Count = 0; Count < 5; Count++)
    list.Add(Count);
return list;
Run Code Online (Sandbox Code Playgroud)

我对应的发出代码如下:

LocalBuilder list = ILout.DeclareLocal(typeof(List<int>));
LocalBuilder Count = ILout.DeclareLocal(typeof(int));
LocalBuilder CmpRes = ILout.DeclareLocal(typeof(bool));
ConstructorInfo DictConstrctor = typeof(List<int>).GetConstructor(new Type[] { });
MethodInfo methodinfo_add = typeof(List<int>).GetMethod("Add", new[] { typeof(int) });
Label IL_001C = ILout.DefineLabel();
Label IL_000B = ILout.DefineLabel();

ILout.Emit(OpCodes.Newobj, DictConstrctor);
ILout.Emit(OpCodes.Stloc_0, list);
ILout.Emit(OpCodes.Ldc_I4_0);
ILout.Emit(OpCodes.Stloc_1, Count);

ILout.Emit(OpCodes.Br_S, IL_001C);
ILout.MarkLabel(IL_000B);
ILout.Emit(OpCodes.Ldloc_0, list);
ILout.Emit(OpCodes.Ldloc_1, Count);
ILout.Emit(OpCodes.Call, methodinfo_add);

ILout.Emit(OpCodes.Ldloc_1, Count);
ILout.Emit(OpCodes.Ldc_I4_1);
ILout.Emit(OpCodes.Add);

ILout.Emit(OpCodes.Stloc_1, Count);
ILout.MarkLabel(IL_001C);
ILout.Emit(OpCodes.Ldloc_1, Count);
ILout.Emit(OpCodes.Ldc_I4_2);
ILout.Emit(OpCodes.Clt); …
Run Code Online (Sandbox Code Playgroud)

c# reflection cil

3
推荐指数
1
解决办法
129
查看次数

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

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

c# cil

2
推荐指数
1
解决办法
143
查看次数

标签 统计

c# ×2

cil ×2

reflection ×1