2016-06-22 6 views
0

Ich erstelle eine neue Type über TypeBuilder von C# Reflexion. Das Problem, das ich gerade habe, ist, wie man den Methodenkörper erstellt, um die Methode auf dem statischen Feld aufzurufen.Methode aufrufen auf statischem Feld mit IL-Generator in C# Reflexion

Gerade jetzt meine erzeugt (zur Laufzeit) Klasse sieht wie folgt aus:

public class Generated 
{ 
    static private MyObject obj; 

    public MyResponse Hello(MyRequest req1) 
    { 
     return obj.Hello(req1); // this part need to be grnerated 
    } 
} 

jetzt So wie dieses Ich-Erzeugungsverfahren:

MethodBuilder mb = tb.DefineMethod(
    methodInfo.Name, 
    MethodAttributes.Public | MethodAttributes.Final, 
    CallingConventions.HasThis | CallingConventions.ExplicitThis, 
    methodInfo.ReturnType, 
    arguments); 

ILGenerator il = mb.GetILGenerator(); 
il.Emit(OpCodes.Ldnull); // right now I'm just simply returning null 
il.Emit(OpCodes.Ret); 

Also mir bitte sagen, wie kann ich laden statisches Feld auf dem Stapel im Il-Generator und rufen dann bestimmte Methoden darauf auf.

+3

Schreiben Sie zuerst diesen Code in C# und sehen Sie sich an, was IL mit ildasm.exe generiert. Jetzt ist es einfach. –

Antwort

0

Also habe ich gerade ildasm.exe verwendet, um die Klasse zu dekompilieren, die ich in meiner Frage geschrieben habe. Wenn jemand müsse mein Personal ähnlich tun, unter Sie Il-Code haben:

IL_0000: nop 
IL_0001: ldsfld  class ConsoleApplication1.IMyInterface ConsoleApplication1.Controller::obj 
IL_0006: ldarg.1 
IL_0007: callvirt instance class ConsoleApplication1.MyResponse ConsoleApplication1.IMyInterface::Hello(class ConsoleApplication1.MyRequest) 
IL_000c: stloc.0 
IL_000d: br.s  IL_000f 
IL_000f: ldloc.0 
IL_0010: ret 

Auch in meinem Code habe ich entfernt Linien IL_0000,c,d,f, weil (meiner Meinung nach) es nicht benötigt werden.

+1

Ein Blick auf die Release-Build-Version ist besser. –

+0

Welche Version Build-Version? Ich verstehe Sie nicht – MAGx2

+0

Sie betrachten die Debug-Build der Baugruppe. Es hat zu viele unnötige IL-Anweisungen. Wechseln Sie zur Release-Konfiguration und schauen Sie erneut. –

Verwandte Themen