3

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

  1. 动态法

编辑:

下面的事情怎么办?

  1. EmitCall (例如
    IL.EmitCall(OpCodes.Callvirt, GetBuildKey, null); IL.Emit(OpCodes.Unbox_Any, dependencyType); )
  2. LocalBuilder (例如 LocalBuilder 解析 = ilContext.IL.DeclareLocal(typeof(bool));)
  3. System.Reflection.Emit.Label (eg 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(); )
4

1 回答 1

5

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

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

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

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

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

于 2010-07-02T08:11:32.710 回答