首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DynamicMethod在塞西尔

DynamicMethod在塞西尔
EN

Stack Overflow用户
提问于 2010-04-17 02:30:00
回答 1查看 1.1K关注 0票数 3

在塞西尔有类似于Reflection.Emit.DynamicMethod的东西吗?谢谢。

  1. DynamicMethod

编辑:

下面的事情呢?

  1. EmitCall (G.

IL.EmitCall(OpCodes.Callvirt,GetBuildKey,null);IL.Emit(OpCodes.Unbox_Any,dependencyType);OpCodes.Callvirt(例如LocalBuilder resolving = ilContext.IL.DeclareLocal(typeof(bool));)

  • System.Reflection.Emit.Label (例如Label existingObjectNotNull =buildContext.IL.DefineLabel());//我是否必须使用TextMap?

  • ILGenerator.BeginCatchBlock (例如ilContext.IL.BeginCatchBlock(typeof(Exception));))

  • ILGenerator.MarkLabel (例如ilContext.IL.MarkLabel(parameterResolveFailed);)

  • ILGenerator.EndExceptionBlock() (例如ilContext.IL.EndExceptionBlock();)

)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-02 08:11:32

没有办法用塞西尔创建一个DynamicMethod,也没有类似的方法。

DynamicMethod与运行时紧密相连,而Cecil是完全解耦的。他们两人有一个完全不同的类型系统。DynamicMethod应该是动态的,因此必须使用System.Reflection类型系统,因为它是运行时可用的系统。Mono.Cecil有另一种适用于静态分析的这种类型系统的表示形式,而不必在运行时实际加载程序集。因此,如果您想要使用DynamicMethod,您必须与它的环境一起使用它。

这个问题最初是在没有DynamicMethods或SRE的运行时环境中提出的,比如Compact,在运行时可以使用Cecil来发出代码。

当然,这是可能的,但是您必须支付加载组装的代价,这在CF设备上并不是一个小的价格。这意味着,如果您可以通过使用Cecil创建一个只有一个静态方法的程序集来模拟DynamicMethod,这听起来是个糟糕的主意。程序集不会是可收集的(DynamicMethods是),这使得它成为一个巨大的内存泄漏。

如果您需要在Compact上运行时发出代码,则发出尽可能少的程序集,并且发出尽可能少的程序集。

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

https://stackoverflow.com/questions/2656987

复制
相关文章

相似问题

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