2010-05-10 12 views
6

Puedo compilar, obtener una instancia e invocar un método de cualquier tipo de C# programáticamente. Hay mucha información sobre eso, incluido StackOverflow (How can I evaluate a C# expression dynamically?). Mi problema es que estoy en el entorno web y no puedo guardar nada en el directorio/bin. Puedo compilar "en memoria" como sugiere el enlace mencionado anteriormente, pero luego no podré "descargar" mi ensamblado personalizado del dominio de aplicación actual. Después de un tiempo, se convertirá en un gran problema de memoria. ¿Es posible abrir un nuevo AppDomain, compilar un nuevo ensamblado "en memoria", evaluar alguna expresión o acceder a algún miembro de ese ensamblado dentro de ese nuevo AppDomain y matar ese AppDomain de forma segura cuando termine, todo eso sin guardar nada en un disco duro ? Gracias de antemano por los enlaces, sugerencias, etc.¿Puedo compilar y ejecutar la expresión de C# sin guardar el ensamblado en el disco?

+0

Si solo necesita acceder a un método arbitrario de un tipo conocido (y no a la compilación de una expresión más compleja), puede usar el método GetMethod de la clase Type y Delegate.CreateDelegate. Intentaré evitar el uso de un nuevo Dominio de aplicación, si es posible, ya que puede haber mucha complejidad nueva para obtener el Mariscado adecuado. –

+0

Bastante necesito evaluar una expresión C# sobre la marcha. El mismo viejo bool r = Eval ("3> 2"); donde el Eval es algo que me ayudaría a evaluar el bool sin tocar el disco. Entonces, no, la reflexión por sí sola no ayudará aquí. Gracias, sin embargo :) – Sasha

Respuesta

2

¿Has echado un vistazo al tipo DynamicMethod en .Net? Este tipo crea la recolección de basura habilitada en métodos de memoria usando Reflection.Emit. Esto suena exactamente a lo que estás buscando.

+0

Eché de menos todo el asunto de DynamicMethod. Leyendo ya ... Todavía no se puede ver cómo usarlo para evaluar una cosa simple como b = Evaluar ("5 <6"). Mirando más, esperando perder algo. ¡Gracias! – Sasha

Cuestiones relacionadas