2008-09-27 11 views
11

Recientemente me encontré con una breve discusión en otro sitio sobre 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.¿Dónde usaría C# Runtime Compilation?

Muchas gracias.

Respuesta

7

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

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

+0

¡Gracias por la respuesta! – itsmatt

+0

Si desea hacer cosas dinámicas como 'EVAL()' etc., entonces podríamos necesitar el concepto de compilación en tiempo de ejecución – Zasz

2

Al menos un caso que puede usar es al generar 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 ensamblado generado.

+0

este es un buen ejemplo de donde la compensación es un serializador basado en reflexión o un serializador generado dinámicamente – therealhoff

2

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 un método del servicio XML-RPC, p. Ej.

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

Luego, en mi código que llaman algo así como

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

Esta generación de código en tiempo de ejecución utiliza para crear un proxy totalmente funcional para mí, así que se puede utilizar de esta manera:

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

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

+0

Eso es interesante y ayuda a aclararlo un poco para mí. Gracias, Matt. – itsmatt

2

Utilicé 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.

Por lo tanto, estas son mis dos experiencias donde la generación de código de tiempo de ejecución fue una buena cosa.

2

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. Probablemente este no sea el mejor ejemplo de su uso, pero un ejemplo de ello es

+0

¡Santa vaca! Por favor dime que lo hiciste solo para demostrar que podrías. :) – MusiGenesis

+0

Heh. Un poco gracioso, pero d2botnet, era un motor de .net botting para diablo 2. La gente escribió bots en .net para automatizar el juego. También permití desde el diálogo de chat poder escribir: exec cs SOMECODE, o exec vb SOMECODE. por ejemplo, para obtener sus ejecuciones x, y. Game.Print (Me.X + "+ Me.Y); ... – mattlant

+0

Pero en realidad podrías ser creativo y poner lo que quisieras en él. Tendré que tirar de él. hasta la fuente para agarrar el código real para hacerlo que nadie quiere. – mattlant

5

Puede usarlo para agregar soporte de scripting a su aplicación. Para ver ejemplos, busque here o here.

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.

+0

Gracias por la información y los enlaces! – itsmatt

3

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

+0

Gracias por el enlace, Andrei! Apreciar el enlace. – itsmatt

+0

De nada :) –