以下是我的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);
ILout.Emit(OpCodes.Stloc_3, CmpRes);
ILout.Emit(OpCodes.Ldloc_3, CmpRes);
ILout.Emit(OpCodes.Brtrue_S, IL_000B);
ILout.Emit(OpCodes.Ldloc_0, list);
ILout.Emit(OpCodes.Ret);
Run Code Online (Sandbox Code Playgroud)
它抛出异常 - "Common Language Runtime检测到无效程序.".
我在这里做错了什么?任何帮助表示赞赏.
ILout.Emit(OpCodes.Stloc_1, Count);
Run Code Online (Sandbox Code Playgroud)
和
ILout.Emit(OpCodes.Ldloc_1, Count);
Run Code Online (Sandbox Code Playgroud)
毫无意义.如果您明确说"使用本地1",则无需其他参数
同样:
ILout.Emit(OpCodes.Stloc_3, CmpRes);
ILout.Emit(OpCodes.Ldloc_3, CmpRes);
Run Code Online (Sandbox Code Playgroud)
坦率地说,我不确定这CmpRes是否有用; 没有点存储和加载 - 只需将它留在堆栈上
注意:如果Count是"本地1",那么CmpRes是"本地2"; 没有"本地3",所以Stloc_3并且Ldloc_3是畸形的.
再来一次:
ILout.Emit(OpCodes.Ldloc_0, list);
ILout.Emit(OpCodes.Ldloc_1, Count);
Run Code Online (Sandbox Code Playgroud)
-
接下来我们接听电话; 你正在做一个静态的电话:
ILout.Emit(OpCodes.Call, methodinfo_add);
Run Code Online (Sandbox Code Playgroud)
但这是对象的实例方法,因此应该是虚拟调用.
又是另一个当地的摸索:
ILout.Emit(OpCodes.Ldloc_1, Count);
Run Code Online (Sandbox Code Playgroud)
和这里:
ILout.Emit(OpCodes.Stloc_1, Count);
Run Code Online (Sandbox Code Playgroud)
和这里:
ILout.Emit(OpCodes.Ldloc_0, list);
Run Code Online (Sandbox Code Playgroud)
但是,我也有严重的怀疑,这个循环(即使已经修复)做了你期望它做的事情 - 如果我读得正确,它实际上是:
var list = new List<int>();
for(int i [= 0] ; i < 2 ; i++) // note the 0 here implicit not explicit
{
list.Add(i);
}
return list;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |