c# .net scripting compiler-construction
http://sourceforge.net/projects/luabinaries/files/5.2/Windows%20Libraries/Dynamic/lua-5.2_Win32_dll7_lib.zip/download

c# - Adición de funcionalidad de scripting to.NET aplicaciones



compiler-construction (9)

Es posible que pueda usar IronRuby para eso.

De lo contrario, te sugiero que tengas un directorio donde coloques ensambles precompilados. Entonces podría tener una referencia en la base de datos para el ensamblaje y la clase, y usar la reflexión para cargar los ensamblajes adecuados en tiempo de ejecución.

Si realmente desea compilar en tiempo de ejecución, puede usar CodeDOM, entonces puede usar la reflexión para cargar el ensamblado dinámico. Artículo de documentación de Microsoft que podría ayudar .

Tengo un pequeño juego escrito en C #. Utiliza una base de datos como back-end. Es un juego de cartas coleccionables , y quería implementar la función de las cartas como un script.

Lo que quiero decir es que esencialmente tengo una interfaz, ICard , que implementa una clase de tarjeta ( public class Card056: ICard ) y que contiene la función que el juego llama.

Ahora, para hacer que la cosa sea mantenible / modificable, me gustaría tener la clase para cada tarjeta como código fuente en la base de datos y esencialmente compilarla en el primer uso. Entonces, cuando tenga que agregar / cambiar una tarjeta, simplemente la agregaré a la base de datos y le diré a mi aplicación que actualice, sin necesidad de ninguna implementación de ensamblaje (especialmente porque estaríamos hablando de 1 ensamblaje por tarjeta, lo que significa cientos de ensamblajes) .

¿Es eso posible? Registre una clase desde un archivo fuente y luego ejemplifique, etc.

ICard Cards[current] = new MyGame.CardLibrary.Card056(); Cards[current].OnEnterPlay(ref currentGameState);

El lenguaje es C #, pero una bonificación adicional si es posible escribir el script en cualquier lenguaje .NET.


Estoy usando LuaInterface1.3 + Lua 5.0 para una aplicación NET 1.1.

El problema con Boo es que cada vez que analiza / compila / evalúa su código sobre la marcha, crea un conjunto de clases boo para que obtenga pérdidas de memoria.

Lua, por otro lado, no hace eso, por lo que es muy estable y funciona de maravilla (puedo pasar objetos de C # a Lua y viceversa).

Hasta ahora no lo he puesto en PROD, pero parece muy prometedor.

Tuve problemas de pérdida de memoria en PROD usando LuaInterface + Lua 5.0 , por lo tanto, usé Lua 5.2 y me vinculé directamente a C # con DllImport. Las pérdidas de memoria estaban dentro de la biblioteca LuaInterface.

Lua 5.2: de http://luabinaries.sourceforge.net y http://sourceforge.net/projects/luabinaries/files/5.2/Windows%20Libraries/Dynamic/lua-5.2_Win32_dll7_lib.zip/download

Una vez que hice esto, todas las pérdidas de memoria desaparecieron y la aplicación fue muy estable.


La aplicación principal que vende mi división hace algo muy similar para proporcionar personalizaciones de clientes (lo que significa que no puedo publicar ninguna fuente). Tenemos una aplicación C # que carga scripts dinámicos de VB.NET (aunque cualquier lenguaje .NET podría ser fácilmente compatible; se eligió VB porque el equipo de personalización provenía de un fondo ASP).

Usando el CodeDom de .NET compilamos los scripts de la base de datos, usando el VB CodeDomProvider (molestamente, por defecto es .NET 2, si quieres soportar las características 3.5 necesitas pasar un diccionario con "CompilerVersion" = "v3.5" a su constructor). Use el método CodeDomProvider.CompileAssemblyFromSource para compilarlo (puede pasar configuraciones para forzarlo a compilarse solo en la memoria).

Esto daría como resultado cientos de ensamblajes en la memoria, pero podría reunir todos los códigos de las clases dinámicas en un solo ensamblaje y volver a compilar todo el lote cuando se produzca algún cambio. Esto tiene la ventaja de que puede agregar un indicador para compilar en el disco con un PDB para cuando esté probando, lo que le permite depurar a través del código dinámico.


La próxima versión de .NET (5.0?) Ha hablado mucho sobre la apertura del "compilador como servicio" que haría posible la evaluación directa de scripts.


Puede usar cualquiera de los lenguajes DLR, que proporcionan una manera de alojar realmente su propia plataforma de scripting. Sin embargo, no tiene que usar un lenguaje de script para esto. Puede usar C # y compilarlo con el proveedor del código C #. Siempre que lo cargue en su propio AppDomain, puede cargarlo y descargarlo al contenido de su corazón.


Sí, pensé en eso, pero pronto descubrí que otro lenguaje específico de dominio (DSL) sería demasiado.

Esencialmente, necesitan interactuar con mi estado de juego de formas posiblemente impredecibles. Por ejemplo, una carta podría tener una regla: "Cuando estas cartas entran en juego, todos tus súbditos no muertos obtienen +3 de ataque contra los enemigos voladores, excepto cuando el enemigo es bendecido". Como los juegos de cartas coleccionables se basan en turnos, GameState Manager activará los eventos de OnStageX y permitirá que las tarjetas modifiquen otras tarjetas o el GameState de la manera que la tarjeta necesite.

Si intento crear un DSL, tengo que implementar un conjunto de características bastante grande y posiblemente actualizarlo constantemente, lo que cambia el trabajo de mantenimiento a otra parte sin eliminarlo realmente.

Es por eso que quería quedarme con un lenguaje .NET "real" para poder simplemente desencadenar el evento y dejar que la tarjeta manipule el estado del juego de cualquier manera (dentro de los límites de la seguridad de acceso al código).


Si no desea usar el DLR, puede usar Boo (que tiene un intérprete) o puede considerar el proyecto Script.NET (S #) en CodePlex . Con la solución Boo, puede elegir entre secuencias de comandos compiladas o usar el intérprete, y Boo crea un buen lenguaje de secuencias de comandos, tiene una sintaxis flexible y un lenguaje extensible a través de su arquitectura de compilador abierta. Sin embargo, Script.NET también se ve bien, y podría extender fácilmente ese lenguaje, así como también es un proyecto de código abierto y utiliza un Generador de compiladores muy amigable ( Irony.net ).


Sugeriría usar LuaInterface ya que ha implementado completamente Lua donde parece que Nua no está completo y probablemente no implemente alguna funcionalidad muy útil (rutinas, etc.).

Si desea utilizar algunos de los módulos Lua preempaquetados externos, le sugiero que utilice algo similar a 1.5.x en lugar de la serie 2.x que crea código totalmente administrado y no puede exponer la API de C necesaria.


La solución C # Script de Oleg Shilo (en The Code Project ) es realmente una gran introducción para proporcionar capacidades de script en su aplicación.

Un enfoque diferente sería considerar un lenguaje que esté específicamente diseñado para secuencias de comandos, como IronRuby , IronPython o Lua .

IronPython y IronRuby están disponibles hoy en día.

Para obtener una guía para incrustar IronPython, lea Cómo incrustar el soporte de script IronPython en su aplicación existente en 10 sencillos pasos .

Lua es un lenguaje de script comúnmente utilizado en juegos. Hay un compilador Lua para .NET, disponible en CodePlex - http://www.codeplex.com/Nua

Esa base de código es una gran lectura si quieres aprender sobre cómo construir un compilador en .NET.

Un ángulo completamente diferente es probar PowerShell . Existen numerosos ejemplos de incrustación de PowerShell en una aplicación: aquí hay un proyecto exhaustivo sobre el tema: Powershell Tunnel