Moin,
ich versuche mich gerade an IL-Code und versuche den decompilierten Code einer kleinen Test-Anwendung dynamisch in C# nachzubauen.
Soweit verstehe ich den Code auch (glaube ich zumindest), Probleme habe ich bei der Umsetzung in C# mit den Emit-Überladungen.
Die Klasse, die ich erstelle, enthält unter Anderem ein Feld mit einem Delegat-Typen.
Dieser Delegat soll nun in einer Property aufgerufen werden, der soll im Set-Accessor der angegebenen Wert prüfen.
Hier das Vorbild, nach dem ich arbeite:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| IL_0017: ldarg.0 IL_0018: ldfld class [mscorlib]System.Func`2<class ILTest.Program, bool> ILTest.Program::_MyObjectValidator IL_001d: ldarg.1 IL_001e: callvirt instance !1 class [mscorlib]System.Func`2<class ILTest.Program, bool>::Invoke(!0) IL_0023: stloc.0 IL_0024: ldloc.0 IL_0025: brtrue.s IL_0037 |
Und soweit bin ich bisher:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| propertySetAccessorIL.Emit(OpCodes.Ldarg_0); propertySetAccessorIL.Emit(OpCodes.Ldfld, _validatorField); propertySetAccessorIL.Emit(OpCodes.Ldarg_1); propertySetAccessorIL.EmitCall(OpCodes.Callvirt, , new Type[] { PropertyDefinition.PropertyType, typeof(bool) }); propertySetAccessorIL.Emit(OpCodes.Stloc_0); propertySetAccessorIL.Emit(OpCodes.Ldloc_0); propertySetAccessorIL.Emit(OpCodes.Brtrue_S, endCheckWithValidatorLabel); |
Das Feld wird auf den Auswertungsstapel geladen und wartet jetzt dort darauf, dass der Delegat aufgerufen wird.
Die Methoden Emit oder EmitCall verlangen aber beide eine MethodInfo, die mir zu dem Zeitpunkt aber noch nicht bekannt ist.
Ich habe nur die FieldInfo des Feldes und kann mir über den Wert die MethodInfo holen, aber auch nur mit einer Instanz, die ich nicht habe.
Weiß jemand, wie ich den Aufruf des Delegaten in diesem Instanz-Feld richtig darstellen kann?
Besten Dank im Vorraus
