2017-06-15 3 views
-1

So habe ich so etwas wie diesesC# IL Emiter Lastgröße Typ Objekt

public void test(string name, Func<object> fuc) 
    { 
     object x = fuc(); 
     FieldInfo fdt = Dest.GetField(nameDest, BindingFlags.NonPublic | 
     BindingFlags.Public | BindingFlags.Instance); 

     ilGenerator.Emit(OpCodes.Ldarg_0); 
     ilGenerator.Emit(OpCodes.Ldfld, fieldBuilder); 

     //and here i want to load the x 

     ilGenerator.Emit(OpCodes.Stfld, fdt); 
    } 

Kann mir jemand helfen plz? Danke

+0

Warum haben Sie so etwas? –

+0

Warum die Downvotes? Es ist eine häufige Frage und während DEFINITIV ein Duplikat, gibt es Flags dafür. – hoodaticus

+1

Gibt es einen Grund, warum Sie fuc() nicht nur zur Laufzeit aufrufen? – hoodaticus

Antwort

1

Sie können nicht. Abhängig davon, wie und wann die von Ihnen generierte IL aufgerufen wird, ist das Objekt möglicherweise nicht zugänglich (z. B. können Sie die IL in einer Baugruppe speichern und sie in einem separaten Prozess verwenden).

Was Sie brauchen, ist ein Code, der das Objekt wiederherstellen kann. Sie können dies möglicherweise tun, indem Sie das Objekt in einem Feld speichern (wahrscheinlich static) und dann laden, wenn die IL nur in der aktuellen Prozess-/Anwendungsdomäne verwendet wird.

Eine andere Option wäre, eine Art von Serialisierung zu verwenden, um das Objekt zu speichern und es dann in Ihrem IL zu deserialisieren, vorausgesetzt, das Objekt kann serialisiert werden.

+0

Dieses statische Feld kann auch ein Dictionary sein. Der Schlüssel kann eine blockierungsfreie inkrementierte Ganzzahl sein, die als Objekt-ID verwendet wird, und der Wert kann das Objekt sein, das Sie benötigen. Dies funktioniert, da INTS im Gegensatz zu ganzen Objekten in der Quelle fest codiert sein können. Also drücken Sie einfach den int-Schlüssel zum Kompilieren auf den Stapel und rufen dann den Indexer des Wörterbuchs auf, um das Objekt zu holen. – hoodaticus