Pregunta

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

Muchas gracias.

¿Fue útil?

Solución

Por lo general, veo que se usa en los casos en los que actualmente estás usando Reflection y necesitas optimizar el rendimiento.

Por ejemplo, en lugar de utilizar la reflexión para llamar al método X, genera un método dinámico en tiempo de ejecución para que haga esto por usted.

Otros consejos

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

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

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

Al menos un caso que puede usar es cuando se genera un código dinámico. Por ejemplo, el marco lo usa 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 lo usa 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.

Bueno, todo el código C # se compila en tiempo de ejecución, ya que es un compilador JIT (just-in-time). Supongo que se está refiriendo a Reflexión. Emita 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 de método de un servicio XML-RPC, por ejemplo

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

Luego en mi código llamo algo 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 completamente funcional para mí, por lo que puedo usarlo así:

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

Esto luego maneja la llamada XML-RPC para mí. Bastante bien.

Utilicé los servicios de compilación 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 #, se compila en un ensamblaje y luego se puede usar 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 como 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 en la universidad) en el 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.

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

algo para lo que lo usé fue para permitir que el código C # y VB lo ejecute el usuario ad-hoc. Podrían escribir una línea de código (o un par de líneas) y se compilarían, cargarían en un dominio de aplicación, se ejecutarían y luego se descargarían. Probablemente este no sea el mejor ejemplo de su uso, pero un ejemplo de ello, sin embargo,

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