塞西尔的DynamicMethod

Mic*_*ync 3 mono mono.cecil

是否有类似于Cecil的Reflection.Emit.DynamicMethod?谢谢.

  1. DynamicMethod的

编辑:

对于以下事情呢?

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

Jb *_*ain 5

没有办法用Cecil创建DynamicMethod,也没有等效的.

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

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

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

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