gpt4 book ai didi

mono - Cecil 中的 DynamicMethod

转载 作者:行者123 更新时间:2023-12-01 12:00:06 24 4
gpt4 key购买 nike

Cecil中有类似Reflection.Emit.DynamicMethod的东西吗?谢谢。

  1. 动态方法

编辑:

下面的事情呢?

  1. EmitCall(例如
    IL.EmitCall(OpCodes.Callvirt, GetBuildKey, null);IL.Emit(OpCodes.Unbox_Any, dependencyType);)
  2. LocalBuilder(例如 LocalBuilder resolving = ilContext.IL.DeclareLocal(typeof(bool));)
  3. System.Reflection.Emit.Label(例如 Label existingObjectNotNull = buildContext.IL.DefineLabel();)//我必须使用 TextMap 吗?
  4. ILGenerator.BeginCatchBlock(例如 ilContext.IL.BeginCatchBlock(typeof(Exception)); )
  5. ILGenerator.MarkLabel(例如 ilContext.IL.MarkLabel(parameterResolveFailed); )
  6. ILGenerator.EndExceptionBlock()(例如 ilContext.IL.EndExceptionBlock();)

最佳答案

无法使用 Cecil 创建 DynamicMethod,也没有等效方法。

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

这个问题最初是在没有 DynamicMethods 或 SRE 的运行时上下文中提出的,比如 Compact Framework,其中 Cecil 可用于在运行时发出代码。

当然可以,但是你要付出加载程序集的代价,这在CF设备上是不小的代价。这意味着,如果您可以通过使用 Cecil 创建仅包含一个静态方法的程序集来以某种方式模拟 DynamicMethod,这听起来是个糟糕的主意。这些程序集将不可收集(DynamicMethods 是),从而导致巨大的内存泄漏。

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

关于mono - Cecil 中的 DynamicMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2656987/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com