2016-06-22 55 views
0

我正在通過來自C#反射的TypeBuilder生成新的Type。我現在所面臨的問題是如何構建方法體來調用靜態字段上的方法。在C#反射中使用IL生成器在靜態字段上調用方法

現在我的生成(在運行時)類看起來是這樣的:

public class Generated 
{ 
    static private MyObject obj; 

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

所以像這樣,現在我生成方法:

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); 

所以,請告訴我,我怎麼可以加載在Il發生器堆棧中的靜態字段,然後在其上調用某種方法。

+3

首先在C#中編寫代碼,並查看它通過ildasm.exe生成的IL。現在很簡單。 –

回答

0

所以我只用ildasm.exe反編譯我發佈在我的問題中的類。如果有人需要做的工作人員與我相似,下面你有IL代碼:

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 

而且在我的代碼我已經刪除線IL_0000,c,d,f,因爲(在我看來)有沒有必要的。

+1

查看發佈版本更好。 –

+0

哪個發佈版本?我不明白你 – MAGx2

+0

您正在查看程序集的Debug版本。它有太多不必要的IL指令。切換到釋放配置,然後再看。 –