c# - net - roslyn symbol table




Skriptfunktionen zu.NET-Anwendungen hinzufügen (6)

Ich habe ein kleines Spiel in C # geschrieben. Es verwendet eine Datenbank als Backend. Es ist ein Sammelkartenspiel und ich wollte die Funktion der Karten als Skript implementieren.

Was ich meine, ist, dass ich im Wesentlichen eine Schnittstelle, ICard , ICard , die eine ICard implementiert ( public class Card056 : ICard ) und die eine Funktion enthält, die vom Spiel aufgerufen wird.

Um das Ding nun wartbar / modifizierbar zu machen, würde ich gerne die Klasse für jede Karte als Quellcode in der Datenbank haben und sie im Wesentlichen beim ersten Gebrauch kompilieren. Wenn ich also eine Karte hinzufügen / ändern muss, füge ich sie einfach der Datenbank hinzu und sage meiner Anwendung, dass sie aktualisiert werden muss, ohne dass eine Assembly-Bereitstellung erforderlich ist (besonders, da wir über 1 Baugruppe pro Karte sprechen würden, was Hunderte von Baugruppen bedeutet). ..

Ist das möglich? Registrieren Sie eine Klasse aus einer Quelldatei, und instanziieren Sie sie.

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

Die Sprache ist C #, aber ein zusätzlicher Bonus, wenn es möglich ist, das Skript in einer beliebigen .NET-Sprache zu schreiben.


Sie können IronRuby dafür verwenden.

Ansonsten würde ich vorschlagen, dass Sie ein Verzeichnis haben, in dem Sie vorkompilierte Assemblys platzieren. Dann könnten Sie in der DB einen Verweis auf die Assembly und die Klasse haben und Reflection verwenden, um zur Laufzeit die richtigen Assemblys zu laden.

Wenn Sie zur Laufzeit wirklich kompilieren möchten, können Sie das CodeDOM verwenden, dann können Sie Reflektion verwenden, um die dynamische Assembly zu laden. MSDN-Artikel, der helfen könnte .


Sie könnten jede der DLR-Sprachen verwenden, die eine Möglichkeit bieten, Ihre eigene Scripting-Plattform wirklich einfach zu hosten. Sie müssen jedoch keine Skriptsprache verwenden. Sie könnten C # verwenden und es mit dem C # -Code-Provider kompilieren. Solange Sie es in seine eigene AppDomain laden, können Sie es nach Herzenslust laden und entladen.


Ich würde vorschlagen, LuaInterface zu verwenden, da es Lua vollständig implementiert hat, wo es scheint, dass Nua nicht vollständig ist und wahrscheinlich keine sehr nützliche Funktionalität implementiert (Koroutinen, usw.).

Wenn Sie einige der vorgepackten Lua-Module von außen verwenden möchten, würde ich vorschlagen, etwas in der Art von 1.5.x zu verwenden, im Gegensatz zu der 2.x-Serie, die vollständig verwalteten Code erstellt und die erforderliche C-API nicht verfügbar macht.


Die Hauptanwendung, die meine Abteilung verkauft, funktioniert sehr ähnlich, um Kundenanpassungen bereitzustellen (was bedeutet, dass ich keine Quelle posten kann). Wir haben eine C # -Anwendung, die dynamische VB.NET-Skripte lädt (obwohl jede .NET-Sprache leicht unterstützt werden könnte - VB wurde gewählt, weil das Anpassungsteam von einem ASP-Hintergrund kam).

Mit .NET CodeDom kompilieren wir die Skripte aus der Datenbank, mit dem VB CodeDomProvider (ärgerlicherweise ist es standardmäßig auf .NET 2, wenn Sie 3.5 Features unterstützen möchten, müssen Sie ein Wörterbuch mit "CompilerVersion" = "v3.5" an seine Konstrukteur). Verwenden Sie die Methode " CodeDomProvider.CompileAssemblyFromSource ", um sie zu kompilieren (Sie können die Einstellungen übergeben, damit sie nur im Arbeitsspeicher kompiliert werden können).

Dies würde zu Hunderten von Baugruppen im Speicher führen, aber Sie könnten den gesamten Code der dynamischen Klassen in einer einzigen Baugruppe zusammenfassen und die gesamte Baugruppe bei jeder Änderung neu kompilieren. Dies hat den Vorteil, dass Sie ein Flag hinzufügen können, das beim Testen auf der Festplatte mit einem PDB kompiliert wird, sodass Sie über den dynamischen Code debuggen können.


In der nächsten Version von .NET (5.0?) Wurde viel darüber gesprochen, den "Compiler as a Service" zu öffnen, der Dinge wie eine direkte Skriptauswertung ermöglichen würde.


Oleg Shilos C # Script Lösung (bei The Code Project ) ist wirklich eine großartige Einführung in die Bereitstellung von Skript Fähigkeiten in Ihrer Anwendung.

Ein anderer Ansatz wäre, eine speziell für Skripte erstellte Sprache zu berücksichtigen, wie IronRuby , IronPython oder Lua .

IronPython und IronRuby sind beide heute verfügbar.

Eine Anleitung zum Einbetten von IronPython finden Sie unter Einbetten von IronPython-Skriptunterstützung in Ihre bestehende Anwendung in 10 einfachen Schritten .

Lua ist eine Skriptsprache, die häufig in Spielen verwendet wird. Es gibt einen Lua-Compiler für .NET, der über CodePlex erhältlich ist - http://www.codeplex.com/Nua

Diese Codebase ist eine großartige Lektüre, wenn Sie mehr über das Erstellen eines Compilers in .NET erfahren möchten.

Ein anderer Blickwinkel ist PowerShell . Es gibt zahlreiche Beispiele für die Einbettung von PowerShell in eine Anwendung - hier ein ausführliches Projekt zum Thema: Powershell Tunnel





compiler-construction