Pregunta

¿Hay algo similar a Reflection.Emit.DynamicMethod en Cecil? Gracias.

  1. DynamicMethod

Editar

¿Qué hay de las siguientes cosas?

  1. EmitCall (por ejemplo
    IL.EmitCall (OpCodes.Callvirt, GetBuildKey, null); IL.Emit (OpCodes.Unbox_Any, dependencyType); )
  2. LocalBuilder (por ejemplo LocalBuilder resolver = ilContext.IL.DeclareLocal (typeof (bool));)
  3. System.Reflection.Emit.Label (por ejemplo Label existingObjectNotNull = buildContext.IL.DefineLabel ();) // hacer Tengo que usar TextMap?
  4. ILGenerator.BeginCatchBlock (por ejemplo ilContext.IL.BeginCatchBlock (typeof (Excepción));)
  5. ILGenerator.MarkLabel (por ejemplo ilContext.IL.MarkLabel (parameterResolveFailed);)
  6. ILGenerator.EndExceptionBlock () (por ejemplo ilContext.IL.EndExceptionBlock ();)
¿Fue útil?

Solución

No hay manera de crear una DynamicMethod con Cecil, ni tiene un equivalente.

A DynamicMethod está fuertemente ligado al tiempo de ejecución, mientras que Cecil está completamente desacoplado. El dos de ellos tienen un sistema de tipo completamente separados. DynamicMethod están destinados a ser, así, dinámica, y como tal tiene que utilizar el sistema de tipos System.Reflection, ya que es la que está disponible en tiempo de ejecución. Mono.Cecil tiene otra representación de este sistema de tipo adecuado para el análisis estático, sin tener que cargar en realidad el conjunto en tiempo de ejecución. Así que si usted desea utilizar un DynamicMethod, usted tiene que usarlo junto con su medio ambiente.

Esta pregunta se le pidió originalmente, IIRC, en el contexto de los tiempos de ejecución y sin DynamicMethods o SRE todos juntos, como el Compact Framework, donde Cecil se puede utilizar para Emite código en tiempo de ejecución.

Por supuesto que es posible, pero entonces usted tiene que pagar el precio de la carga de la asamblea, que no es pequeño precio en los dispositivos de FQ. Esto significa que si de alguna manera podría emular un DynamicMethod mediante la creación de un conjunto con un solo método estático con Cecil, suena una idea terrible. Los conjuntos no serían coleccionable (DynamicMethods son), por lo que es una pérdida de memoria gigante.

Si necesita emitir código en tiempo de ejecución en el marco compacto, emitir lo menos posible, y emiten el menor número de montajes como sea posible.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top