3

System.Reflection.Emit を使用していますが、ある時点で MethodBuilder からデリゲートを作成したいと考えています。

MethodBuilder fooBuilder = createFooMethodBuilder();
ILGenerator ilGenerator = ...
Type delegateType = typeof(DelegateType);
LocalBuilder delegateVar = ilGenerator.DeclareLocal(delegateType);
//Somehow create emit instructions to create delegate from fooBuilder
//Store delegate in delegateVar using 

静的関数からデリゲートを作成するには、次のようなものが使用されていることがわかりました。

ldnull 
ldftn void class Test.MainClass::bar()
newobj instance void class Test.DelegateType::'.ctor'(object, native int)

しかし今、私は立ち往生しています。MethodBuilder を ldftn する方法が必要です。次に、次の行の命令を発行する方法が必要です。そして、ネイティブ int を受け入れるコンストラクターを取得する方法がわかりません。

助言がありますか?

4

2 に答える 2

6

Anative intIntPtrC# の です。

ConstructorInfo次を使用して、デリゲート タイプの を取得できますType.GetConstructor

var constructorInfo =
    delegateType.GetConstructor(new Type[] { typeof(object), typeof(IntPtr) });

次に、次のように IL 命令を発行できます。

il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Ldftn, someMethodInfo);
il.Emit(OpCodes.Newobj, constructorInfo);
于 2010-12-06T00:26:08.000 に答える
0

ILGenerator クラスには methodinfo を受け取る Emit オーバーロードがあるため、ilGenerator.Emit(Opcodes.ldftn, mi)mi呼び出したいメソッドです。これは、リフレクション API で見つけた任意のメソッドにすることも、MethodBuilder で作成した別のメソッドにすることもできます (から派生しますMethodInfo)。

同様に、コンストラクターを呼び出すには、ターゲット オーバーロードの ConstructorInfo を提供する newobj 命令を発行します。

于 2010-12-06T00:49:21.073 に答える