L'ajout de la fonctionnalité de script pour .NET applications
J'ai un peu de jeu écrit en C#. Il utilise une base de données back-end. C'est
un jeu de cartes à collectionner, et je voulais mettre en œuvre la fonction des cartes qu'un script.
Ce que je veux dire, c'est que j'ai essentiellement une interface, ICard
, qui une carte de classe implémente (public class Card056: ICard
) et qui contient la fonction qui est appelée par le jeu.
Maintenant, pour rendre la chose facile à gérer/moddable, je voudrais avoir la classe pour chaque carte que le code source dans la base de données, et essentiellement de le compiler à la première utilisation. Alors quand je dois ajouter/modifier une carte, je vais l'ajouter à la base de données et de dire à ma demande de rafraîchissement, sans avoir besoin d'une assemblée de déploiement (surtout depuis que nous parlerions de 1 assemblage par carte, ce qui signifie des centaines d'assemblées).
Est-ce possible? Inscrire une classe à partir d'un fichier source, puis instancier, etc.
ICard Cards[current] = new MyGame.CardLibrary.Card056();
Cards[current].OnEnterPlay(ref currentGameState);
La langue est le C#, mais bonus supplémentaire si il est possible d'écrire le script en toute .NET de la langue.
- C'est drôle, moi et un ami ont été la pensée de l'écriture d'un jeu de cartes à collectionner en C# d'un moment de retour, ne suppose pas que vous avez encore la source pour ça? Intéressés par la façon dont vous l'avais abordé ce problème.
- Non, n'ont rien à gauche, c'était vraiment au début et était essentiellement juste de travailler comme je l'ai indiqué ci-dessus. Aujourd'hui, je veux le regarder dans Roslyn faire de compilation C#: blogs.msdn.com/b/csharpfaq/archive/2011/10/19/... - Sinon, JavaScript à l'aide de Jint - jint.codeplex.com
- ah merci, mais j'ai été à la recherche de plus pour la mise en œuvre du jeu de cartes à collectionner lui-même et la structure que vous auriez utilisé, par opposition au moteur de script. Merci quand même 🙂
Vous devez vous connecter pour publier un commentaire.
Oleg Shilo C# Script de solution (dans Le Projet de Code) est vraiment une excellente introduction à fournir script capacités dans votre application.
Une autre approche serait de considérer une langue qui est spécifiquement conçu pour l'écriture de scripts, tels que IronRuby, IronPython, ou Lua.
IronPython et IronRuby sont disponibles aujourd'hui.
Pour un guide pour l'incorporation de IronPython lire
Comment intégrer IronPython en charge de l'écriture dans votre application existante en 10 étapes faciles.
Lua est un langage de script utilisé couramment dans les jeux. Il y a un Lua compilateur pour .NET, disponible à partir de CodePlex -- http://www.codeplex.com/Nua
Que la base de code est un livre à lire si vous voulez apprendre sur la construction d'un compilateur en .NET.
Un angle différent, est d'essayer PowerShell. Il existe de nombreux exemples de l'intégration de PowerShell dans une application-voici une approfondie projet sur le thème:
Powershell Tunnel
Vous pourriez être en mesure d'utiliser IronRuby pour que.
Sinon, je vous suggère de vous avez un répertoire où vous placez précompilés assemblées. Ensuite, vous pourriez avoir une référence dans la DB à l'assemblée et de la classe, et l'utilisation de la réflexion pour charger le bon assemblées lors de l'exécution.
Si vous voulez vraiment compiler au moment de l'exécution, vous pouvez utiliser les CodeDOM, alors vous pouvez utiliser la réflexion pour charger la dynamique de l'assemblage. La documentation de Microsoft article qui pourrait aider.
Si vous ne souhaitez pas utiliser le DLR, vous pouvez utilisation Boo (qui a un interprète) ou vous pourriez envisager de l'Script.NET (S#) projet sur CodePlex. Avec le Boo solution, vous pouvez choisir entre des scripts compilés ou à l'aide de l'interprète, et Boo fait un bon langage de script, dispose d'un flexible de la syntaxe et un langage extensible via son ouverture au compilateur de l'architecture. Script.NET a l'air sympa aussi, bien que, et vous pouvez facilement étendre cette langue ainsi que de son un projet open source et utilise un très sympathique Compilateur Générateur (Irony.net).
Vous pouvez utiliser une des langues DLR, qui fournissent une façon de vraiment facilement héberger votre propre plate-forme de script. Cependant, vous n'avez pas à utiliser un langage de script pour cette. Vous pourriez utiliser le C# et le compiler avec le code C# fournisseur. Aussi longtemps que vous le chargez dans son propre domaine d'application, vous pouvez charger et décharger le contenu de votre coeur.
Je suggérerais à l'aide de LuaInterface comme il a pleinement mis en œuvre Lua où il semble que Nua n'est pas complète et ne devrait pas mettre en œuvre certaines fonctionnalité très utile (coroutines, etc).
Si vous souhaitez utiliser certaines de l'extérieur préemballées Lua modules, je vous suggère d'utiliser quelque chose le long des lignes de 1.5.x, par opposition à la 2.la série x qui s'appuie entièrement géré code et ne peut pas exposer le nécessaire de l'API C.
Je suis en utilisant LuaInterface1.3 + Lua 5.0 pour un NET 1.1 application.
Le problème avec Boo est que chaque fois que vous analysez/compiler/eval votre code à la volée, il crée un ensemble de boo classes de sorte que vous aurez des fuites de mémoire.
Lua dans l'autre main, ne pas le faire, donc c'est très très stable et fonctionne merveilleux (je peux passer des objets à partir de C# pour Lua et en arrière).
Jusqu'à présent, je n'ai pas la mettre en PROD, mais semble très prometteur.
Je n'ai avoir des problèmes de fuites de mémoire en PROD, à l'aide de LuaInterface + Lua 5.0, j'ai donc utilisé Lua 5.2 et liés directement en C# avec DllImport. Les fuites de mémoire ont été à l'intérieur de la LuaInterface bibliothèque.
Lua 5.2: à partir de http://luabinaries.sourceforge.net et http://sourceforge.net/projects/luabinaries/files/5.2/Windows%20Libraries/Dynamic/lua-5.2_Win32_dll7_lib.zip/download
Une fois que je l'ai fait, tous mes fuites de mémoire ont disparu et l'application est très stable.
L'application principale qui ma division vend fait quelque chose de très semblable à offrir au client la personnalisation (ce qui signifie que je ne peux pas poster n'importe quelle source). Nous avons une application en C# qui se charge dynamique VB.NET les scripts (bien que tout .NET la langue peut être facilement pris en charge - VB a été choisi parce que la personnalisation de l'équipe est venu à partir d'un ASP en arrière-plan).
À l'aide .NET CodeDom nous compiler les scripts de la base de données, à l'aide de la VB
CodeDomProvider
(fâcheusement la valeur par défaut .NET 2, si vous voulez soutenir 3.5 fonctionnalités dont vous avez besoin pour passer un dictionnaire avec "CompilerVersion" = "v3.5" à son constructeur). Utiliser leCodeDomProvider.CompileAssemblyFromSource
méthode pour compiler (vous pouvez passer des paramètres pour le forcer à compiler dans la mémoire.Cela entraînerait des centaines d'assemblées de mémoire, mais vous pourriez mettre tous les classes dynamiques code réunis en une seule assemblée, et de recompiler l'ensemble du lot lors de tout changement. Ceci a l'avantage que vous pourriez ajouter un drapeau à compiler sur le disque avec un APB pour quand vous faites des tests, vous permettant de déboguer grâce à la dynamique de code.
Oui, j'ai pensé à ça, mais j'ai vite compris qu'un autre Domaine Spécifique de la Langue (DSL) serait un peu trop.
Essentiellement, ils ont besoin d'interagir avec mon gamestate éventuellement de façon imprévisible. Par exemple, une carte peut avoir une règle "Lors de ces cartes entrent en jeu, tous vos serviteurs morts-vivants gain de +3 attaque contre les ennemis volants, sauf lorsque l'ennemi est béni". De la négociation, les jeux de cartes sont en tour par tour, le GameState Gestionnaire de feu OnStageX événements et laissez les cartes de modifier d'autres cartes ou le GameState de quelque manière que la carte de besoins.
Si j'essaye de créer un DSL, j'ai à mettre en œuvre un grand ensemble de fonctionnalités et éventuellement mettre à jour en permanence, ce qui décale les travaux d'entretien à l'autre partie sans l'enlever.
C'est pourquoi je voulais rester avec un "vrai" .NET langue essentiellement afin d'être en mesure de simplement déclencher l'événement et de laisser la carte de manipuler le gamestate quelque manière que ce soit (dans les limites du code de sécurité d'accès).
La prochaine version de .NET (5.0?) a eu beaucoup de parler de l'ouverture de la "compilateur en tant que service", ce qui rendrait les choses comme direct script d'évaluation possible.