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)

但现在我被困住了。我需要一种方法来 ldftn MethodBuilder,然后我需要一种方法来发出下一行的指令。而且我不知道如何获得一个接受本机 int 的构造函数。

有什么建议么?

4

2 回答 2

6

A在 C# 中native int是一个。IntPtr

您可以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 类有一个接收方法信息的 Emit 重载,因此您可以执行类似的操作,您要调用的方法ilGenerator.Emit(Opcodes.ldftn, mi)在哪里。mi它可以是您使用反射 API 找到的任何方法,甚至可以是您使用 MethodBuilder 创建的另一个方法(它派生自MethodInfo)。

同样,要调用构造函数,您将发出一个 newobj 指令,为目标重载提供 ConstructorInfo。

于 2010-12-06T00:49:21.073 回答