ILGenerator:加载创建的方法

lui*_*bal 3 .net c# delegates reflection.emit intermediate-language

我正在使用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 
Run Code Online (Sandbox Code Playgroud)

我可以发现从静态函数创建委托使用这样的东西:

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

但是现在我被卡住了.我需要一种方法来修改MethodBuilder然后我需要一种方法来发出以下行的指令.我不知道如何获得一个接受原生int的构造函数.

有什么建议?

dtb*_*dtb 6

A native intIntPtrC#中的一个.

您可以使用以下命令获取ConstructorInfo委托类型Type.GetConstructor:

var constructorInfo =
    delegateType.GetConstructor(new Type[] { typeof(object), typeof(IntPtr) });
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样发出IL指令:

il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Ldftn, someMethodInfo);
il.Emit(OpCodes.Newobj, constructorInfo);
Run Code Online (Sandbox Code Playgroud)