Aquí podría ser tu PUBLICIDAD


Agregar funcionalidad de scripting a aplicaciones .NET

votos
62

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 guión.

Lo que quiero decir es que esencialmente tengo una interfaz, ICardque una clase de carta implementa ( public class Card056 : ICard) y que contiene funciones que son llamadas por el juego.

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 básicamente compilarla en el primer uso. Entonces, cuando tengo que agregar / cambiar una tarjeta, simplemente la agrego a la base de datos y le digo a mi aplicación que actualice, sin necesidad de ninguna implementación de ensamblaje (especialmente porque estaríamos hablando de 1 ensamblado por tarjeta, lo que significa cientos de ensamblajes) .

¿Es eso posible? Registre una clase de un archivo fuente y luego ejecútelo, 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 guión en cualquier idioma .NET.

Publicado el 02/08/2008 a las 00:22
fuente por usuario Michael Stum
En otros idiomas...        العربية       

9 respuestas

votos
37

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

Un enfoque diferente sería considerar un lenguaje específicamente creado para scripting, como IronRuby , IronPython o Lua .

IronPython e IronRuby están disponibles hoy.

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

Lua es un lenguaje de scripting comúnmente utilizado en juegos. Existe 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 a compilar un compilador en .NET.

Un ángulo diferente en conjunto es probar PowerShell . Hay numerosos ejemplos de incorporación de PowerShell en una aplicación: aquí hay un proyecto completo sobre el tema: Powershell Tunnel

Respondida el 02/08/2008 a las 02:49
fuente por usuario Leon Bambrick


Aquí podría ser tu PUBLICIDAD


votos
7

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 el DB para el ensamblaje y la clase, y usar el reflejo para cargar los ensamblajes apropiados en el tiempo de ejecución.

Si realmente desea compilar en tiempo de ejecución, podría usar el CodeDOM, entonces podría usar el reflejo para cargar el ensamblaje dinámico. Artículo de MSDN que podría ayudar .

Respondida el 02/08/2008 a las 05:18
fuente por usuario Eric Haskins

votos
6

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 scripts compilados o usar el intérprete, y Boo crea un buen lenguaje de scripting, tiene una sintaxis flexible y un lenguaje extensible a través de su arquitectura de compilación abierta. Script.NET también se ve bien, y se puede ampliar fácilmente ese idioma, así como es un proyecto de código abierto y utiliza un generador de compiladores muy amigable ( Irony.net ).

Respondida el 06/08/2008 a las 05:28
fuente por usuario Nathan

votos
5

Estoy usando LuaInterface1.3 + Lua 5.0 de 1.1 NET.

El problema con Boo es que cada vez que analizo / compilación / eval su código sobre la marcha, se crea un conjunto de clases de pata por lo que obtendrá pérdidas de memoria.

Lua en el otro lado, no hace eso, por lo que es muy, muy estable y funciona maravillosa (puedo pasar objetos de C # para Lua y hacia atrás).

Hasta ahora no he puesto en PROD aún, pero parece muy prometedor.

Yo no tengo problemas de pérdidas de memoria en PROD usando LuaInterface + Lua 5.0 , por lo tanto, he usado Lua 5.2 y vinculado directamente en C # con DllImport. Las pérdidas de memoria se encontraban dentro de la biblioteca LuaInterface.

Lua 5.2: desde 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 mis pérdidas de memoria se habían ido y la aplicación era muy estable.

Respondida el 17/07/2012 a las 06:08
fuente por usuario Kat Lim Ruiz

votos
5

Sugiero usar LuaInterface, ya que ha implementado Lua por completo, donde parece que Nua no está completo y es probable que no implemente algunas funciones muy útiles (corutinas, etc.).

Si desea utilizar algunos de los módulos Lua preenvasados ​​externos, le sugiero que use algo similar a 1.5.x en comparación con la serie 2.x que crea código completamente administrado y no puede exponer la API C necesaria.

Respondida el 17/09/2008 a las 02:41
fuente por usuario harningt

votos
5

Puede usar cualquiera de los lenguajes DLR, que proporcionan una forma de alojar fácilmente su propia plataforma de scripting. Sin embargo, no tiene que usar un lenguaje de scripting para esto. Podría usar C # y compilarlo con el proveedor del código C #. Siempre y cuando lo cargue en su propio Dominio de aplicación, puede cargarlo y descargarlo a su gusto.

Respondida el 02/08/2008 a las 07:16
fuente por usuario Jesse Ezell

votos
4

La aplicación principal que vende mi división hace algo muy similar para proporcionar personalizaciones del cliente (lo que significa que no puedo publicar ninguna fuente). Tenemos una aplicación C # que carga scripts VB.NET dinámicos (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 CodeDom de .NET, compilamos los scripts desde la base de datos, usando el VB CodeDomProvider(de forma molesta, por defecto, es .NET 2, si quieres soportar funciones 3.5, necesitas pasar un diccionario con "CompilerVersion" = "v3.5" a su constructor ) Use el CodeDomProvider.CompileAssemblyFromSourcemétodo para compilarlo (puede pasar configuraciones para forzarlo a compilar solo en la memoria).

Esto daría como resultado cientos de ensamblajes en la memoria, pero podría poner todo el código de las clases dinámicas juntas en un solo ensamblaje, y recompilar todo 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.

Respondida el 10/08/2008 a las 04:24
fuente por usuario Keith

votos
4

Sí, pensé en eso, pero pronto descubrí que otro Dominio Específico del Dominio (DSL) sería demasiado.

Esencialmente, necesitan interactuar con mi sistema 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 ganan +3 ataques contra enemigos voladores, excepto cuando el enemigo es bendecido". Como los juegos de cartas coleccionables se basan en turnos, GameState Manager activará eventos de OnStageX y permitirá que las cartas modifiquen otras tarjetas o GameState de la forma que la tarjeta necesite.

Si trato de crear una 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 activar el evento y dejar que la tarjeta manipule el estado del juego de cualquier forma (dentro de los límites de la seguridad de acceso al código).

Respondida el 02/08/2008 a las 12:49
fuente por usuario Michael Stum

votos
3

La próxima versión de .NET (5,0?) Ha tenido un montón de hablar de la apertura de la "compilador como un servicio" que haría cosas como la evaluación de la escritura directa posible.

Respondida el 27/11/2010 a las 03:12
fuente por usuario Eric Falsken