首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ILGenerator:加载已创建的方法

ILGenerator:加载已创建的方法
EN

Stack Overflow用户
提问于 2010-12-06 08:11:53
回答 2查看 921关注 0票数 3

我正在使用System.Reflection.Emit,并且在某个时刻,我想从MethodBuilder创建一个委托:

代码语言:javascript
复制
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 

我可以发现,要从静态函数创建委托,可以使用如下所示:

代码语言:javascript
复制
ldnull 
ldftn void class Test.MainClass::bar()
newobj instance void class Test.DelegateType::'.ctor'(object, native int)

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

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-12-06 08:26:08

native int是C#中的IntPtr

可以使用Type.GetConstructor获取委托类型的ConstructorInfo

代码语言:javascript
复制
var constructorInfo =
    delegateType.GetConstructor(new Type[] { typeof(object), typeof(IntPtr) });

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

代码语言:javascript
复制
il.Emit(OpCodes.Ldnull);
il.Emit(OpCodes.Ldftn, someMethodInfo);
il.Emit(OpCodes.Newobj, constructorInfo);
票数 6
EN

Stack Overflow用户

发布于 2010-12-06 08:49:21

ILGenerator类有一个接受method is的Emit重载,因此您可以执行类似ilGenerator.Emit(Opcodes.ldftn, mi)的操作,其中mi是您想要调用的方法。它可以是您使用反射API找到的任何方法,甚至可以是您使用MethodBuilder (它派生自MethodInfo)创建的另一个方法。

类似地,要调用构造函数,您需要发出一条newobj指令,为目标重载提供一个ConstructorInfo。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4362167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档