塞西尔的DynamicMethod

时间:2010-04-17 02:30:00

标签: mono mono.cecil

Cecil有什么类似于Reflection.Emit.DynamicMethod的东西吗?感谢。

  1. DynamicMethod的
  2. 修改:

    以下事情怎么样?

    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();)

1 个答案:

答案 0 :(得分:5)

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

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

最初在没有DynamicMethods或SRE的运行时环境中询问了这个问题iirc,就像Compact Framework一样,Cecil可以用来在运行时发出代码。

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

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