Im Folgenden Code mein C#:Objekte hinzufügen in Schleife in IL Emit zur Liste - erkannt Common Language Runtime ein ungültiges Programm
List<int> list = new List<int>();
for(int Count = 0; Count < 5; Count++)
list.Add(Count);
return list;
Mein entsprechenden ausgesendeten Code wird wie folgt:
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);
Es gibt eine Ausnahme aus - "Common Language Runtime hat ein ungültiges Programm erkannt.".
Was mache ich hier falsch? Jede Hilfe wird geschätzt.
Das sieht aus wie es Loops zu 2 ... ist das absichtlich? –
Wenn du mit emit spielen willst, empfehle ich dringend die Sigil-Bibliothek (https://www.nuget.org/packages/Sigil/) - sie ist ** entworfen **, um dies mit einer API viel intuitiver zu machen das macht es schwer zu versagen und gibt eine klare Fehlermeldung, wenn Sie es immer noch verwalten. –
Danke! Ich werde es später versuchen. Ja, zählen ist 2. Ich habe zu viele Dinge versucht, also könnte ich die Anzahl auf 5 geändert haben .. – badari