Recompila C # mientras se ejecuta, sin AppDomains

Digamos que tengo dos aplicaciones de C #game.exe (XNA, necesita ser compatible con Xbox 360) yeditor.exe (XNA alojado en WinForms) - ambos comparten unaengine.dll Asamblea que hace la gran mayoría del trabajo.

Ahora digamos que quiero agregar algún tipo de script basado en C # (no es un "script" pero lo llamaré así). Cada nivel obtiene su propia clase heredada de una clase base (lo llamaremosLevelController).

Estas son las restricciones importantes para estos scripts:

Necesitan ser reales, compilados en código C #

Deben requerir un trabajo manual mínimo de "pegamento", si lo hay

Deben ejecutarse en el mismo dominio de aplicación que todo lo demás.

Para el juego, esto es bastante sencillo: todas las clases de script se pueden compilar en un ensamblaje (por ejemplo,levels.dll) y las clases individuales se pueden instanciar utilizando la reflexión según sea necesario.

El editor es mucho más difícil. El editor tiene la capacidad de "jugar el juego" dentro de la ventana del editor, y luego restablecer todo de nuevo a donde comenzó (por lo que el editor necesita conocer estos scripts en primer lugar).

Lo que estoy tratando de lograr es básicamente un botón de "recargar guión" en el editor que recompilará y cargará la clase de guión asociada con el nivel que se está editando y, cuando el usuario presiona el botón "jugar", creará una instancia del más reciente. guión compilado.

El resultado será un rápido flujo de trabajo de edición de prueba dentro del editor (en lugar de la alternativa, que es guardar el nivel, cerrar el editor, recompilar la solución, iniciar el editor, cargar el nivel, probar).

Ahora yopensar He desarrollado una forma potencial para lograr esto, que a su vez conduce a una serie de preguntas (que se presentan a continuación):

Compilar la colección de.cs archivos necesarios para un nivel dado (o, si es necesario, el conjuntolevels.dll proyecto) en un conjunto temporal, único nombre. Ese montaje tendrá que hacer referenciaengine.dll. ¿Cómo invocar el compilador de esta manera en tiempo de ejecución? ¿Cómo hacer que salga un ensamblaje de este tipo (y puedo hacerlo en la memoria)?

Cargue el nuevo conjunto. ¿Importa que esté cargando clases con el mismo nombre en el mismo proceso? (¿Tengo la impresión de que los nombres están calificados por el nombre del ensamblado?)

Ahora, como mencioné, no puedo usar AppDomains. Pero, por otro lado, no me importa filtrar versiones antiguas de las clases de script, por lo que la capacidad de descargar no es importante. ¿A menos que sea? Supongo que es posible cargar unos pocos cientos de ensamblajes.

Al reproducir el nivel, instale la clase que se hereda de LevelController del ensamblado específico que se acaba de cargar. ¿Como hacer esto?

Y finalmente:

¿Es este un enfoque sensato? ¿Se podría hacer de una mejor manera?

ACTUALIZACIÓN: en estos días utilizo unenfoque mucho más simple Para resolver el problema subyacente.

Respuestas a la pregunta(4)

Su respuesta a la pregunta