remarks cref c# optimization runtime-compilation

cref - ¿Dónde usarías la compilación C#Runtime?



remarks c# (7)

Al menos un caso que puede usar es cuando genera un código dinámico. Por ejemplo, el marco está usando esto internamente para generar serializadores XML sobre la marcha. Después de buscar en una clase en tiempo de ejecución, puede generar el código para serializar / deserializar la clase. Luego compila ese código y los usuarios según sea necesario. De la misma manera, puede generar código para manejar tablas de bases de datos arbitrarias, etc. y luego compilar y cargar el ensamblaje generado.

Recientemente me encontré con una breve discusión en otro sitio sobre la compilación de tiempo de ejecución de C # mientras buscaba otra cosa y pensé que la idea era interesante. ¿Alguna vez has usado esto? Estoy tratando de determinar cómo / cuándo uno puede usar esto y qué problema soluciona. Me interesaría saber cómo lo has usado o en qué contexto tiene sentido.

Muchas gracias.


Bueno, todo el código C # se compila en tiempo de ejecución, ya que es un compilador JIT (just-in-time). Supongo que te refieres a Reflection.Emit para crear clases, etc. sobre la marcha. Aquí hay un ejemplo que he visto recientemente en la biblioteca Xml-Rpc.Net.

Creo una interfaz C # que tiene la misma firma que las llamadas a métodos del servicio XML-RPC, por ejemplo

IMyProxy : IXmlRpcProxy { [XmlRpcMethod] int Add(int a, int b); }

Luego en mi código llamo algo así como

IMyProxy proxy = (IMyProxy)XmlRcpFactory.Create(typeof(IMyProxy));

Esto utiliza la generación de código en tiempo de ejecución para crear un proxy totalmente funcional para mí, así que puedo usarlo así:

int result = proxy.Add(1, 2);

Esto luego maneja la llamada XML-RPC para mí. Muy genial.


Normalmente, veo que esto se usa en los casos en los que actualmente está utilizando Reflection y necesita optimizar el rendimiento.

Por ejemplo, en lugar de usar la reflexión para llamar al método X, genere un Método dinámico en tiempo de ejecución para hacer esto por usted.


Puede usar esto para agregar soporte de scripting a su aplicación. Para ver ejemplos, mira aquí o aquí .

Es bastante fácil publicar partes de su marco de trabajo interno en la parte de scripting, por lo que con relativa facilidad podría agregar algo a su aplicación que tenga el mismo efecto que, por ejemplo, VBA para Office.


Usé servicios de compilador en tiempo de ejecución de .NET en mi tesis de diploma. Básicamente, se trataba de crear visualmente algún componente gráfico para una visualización de proceso, que se genera como código C #, compilado en un ensamblaje y luego puede ser utilizado en el sistema de destino sin ser interpretado, para hacerlo más rápido y más compacto. Y, como beneficio adicional, las imágenes generadas se podrían empaquetar en el mismo ensamblaje que los recursos.

El otro uso de eso fue en Java. Tenía una aplicación que tenía que trazar una función potencialmente costosa utilizando algún algoritmo numérico (estaba de vuelta en la universidad) que el usuario podía ingresar. Puse la función ingresada en una clase, la compilé y la cargué, y luego estuvo disponible para una ejecución relativamente rápida.

Entonces, estas son mis dos experiencias donde la generación de código de tiempo de ejecución fue algo bueno.


algo para lo que lo usé fue para permitir que el código C # y VB sean ejecutados por el usuario ad-hoc. Podrían escribir una línea de código (o un par de líneas) y se compilaría, cargaría en un dominio de la aplicación y se ejecutaría, y luego se descargaría. Este probablemente no sea el mejor ejemplo de su uso, pero un ejemplo de ello no menos importante


He visto esto (compilación / uso en tiempo de ejecución de las clases System.Reflection.Emit) en la generación de proxies dinámicos ( ejemplo de proyecto de código ) u otros medios para optimizar las llamadas de reflexión (en el tiempo).