2016-06-22 9 views
0

TypeTypeBuilderをC#リフレクションから新しく生成しています。今私が持っている問題は、staticメソッドでメソッドを呼び出すメソッド本体を構築する方法です。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#で記述し、ILがildasm.exeで生成するものを見てください。今は簡単です。 –

答えて

0

私はちょうどildasm.exeを使用して、自分の質問に投稿したクラスを逆コンパイルしました。

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を削除しました。また:あなたはILコードを持っているの下に誰もが、鉱山に似たスタッフを行う必要があります場合は

+1

リリースビルドのバージョンを見る方が良いです。 –

+0

どのビルドバージョンをリリースしますか?私はあなたを理解していません – MAGx2

+0

アセンブリのデバッグビルドを見ています。不必要なIL命令が多すぎます。リリース構成に切り替えて、もう一度見てください。 –

関連する問題