Hinzufügen von Scripting-Funktionalität von .NET-Anwendungen

stimmen
62

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 haben, ICard, die eine Karte Klasse implementiert ( public class Card056 : ICard) und die Funktion enthält , die durch das Spiel aufgerufen werden.

Nun, um die Sache wartbar / modifizierbar machen, ich möchte die Klasse haben für jede Karte als Quellcode in der Datenbank und im Wesentlichen kompilieren es bei der ersten Verwendung. Also, wenn ich muss hinzufügen / eine Karte ändern, werde ich hinzufügen, es nur auf die Datenbank und meine Anwendung sagen zu aktualisieren, ohne dass Montage Einsatz zu benötigen (vor allem, da wir etwa 1 Montage pro Karte sprechen würde, die Hunderte von Baugruppen bedeutet) .

Ist das möglich? Registrieren Sie eine Klasse aus einer Quelldatei und dann instanziiert es usw.

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

Die Sprache ist C # aber Extra-Bonus, wenn es möglich ist, das Skript in einem beliebigen .NET Sprache zu schreiben.

Veröffentlicht am 02/08/2008 um 00:22
quelle vom benutzer
In anderen Sprachen...                            


9 antworten

stimmen
37

Oleg Shilo von C # Script - Lösung (The Code Project ) ist wirklich eine großartige Einführung Skript Fähigkeiten in der Anwendung zu bieten.

Ein anderer Ansatz wäre , eine Sprache zu betrachten , die speziell für Scripting, wie gebaut wird IronRuby , Ironpython oder Lua .

Ironpython und IronRuby sind beide heute verfügbar.

Für einen Leitfaden für die Einbettung lesen Ironpython Wie Ironpython - Skript - Unterstützung in Ihren bestehenden App in 10 einfachen Schritten einzubetten .

Lua ist eine Skriptsprache in Spielen verwendet. Es ist ein Lua - Compiler für .NET, erhältlich von CodePlex - http://www.codeplex.com/Nua

Die Code-Basis ist ein großer lesen, wenn Sie über den Aufbau eine Compiler in .NET lernen wollen.

Ein anderer Winkel insgesamt ist zu versuchen , Powershell . Es gibt zahlreiche Beispiele von Powershell in eine Anwendung einbetten - hier ist ein gründliches Projekt zum Thema: Powershell - Tunnel

Beantwortet am 02/08/2008 um 02:49
quelle vom benutzer

stimmen
7

Sie könnten in der Lage, für das IronRuby zu verwenden.

Sonst würde ich vorschlagen, dass Sie ein Verzeichnis, in dem Sie vorkompilierte Baugruppen platzieren. Dann könnten Sie einen Verweis in der DB zur Baugruppe und Klasse haben, und verwenden Sie Reflektion, um die richtigen Baugruppen zur Laufzeit zu laden.

Wenn Sie wirklich zur Laufzeit kompilieren wollen könnten Sie die CodeDOM verwenden, dann könnten Sie Reflektion verwenden , um die dynamische Assembly zu laden. MSDN - Artikel , die helfen können .

Beantwortet am 02/08/2008 um 05:18
quelle vom benutzer

stimmen
6

Wenn Sie nicht möchten , dass das DLR verwenden , können Sie Boo verwenden (was einen Dolmetscher hat) oder man könnte betrachten die Script.NET (S #) Projekt auf CodePlex . Mit der Boo - Lösung können Sie zwischen kompilierten Skripte wählen oder den Interpreter und Boo macht eine nette Skriptsprache, hat eine flexible Syntax und eine erweiterbare Sprache über seine offene Compiler - Architektur. Script.NET sieht auch nett, aber, und man konnte einen sehr freundlichen Compiler Generator (diese Sprache sowie die ein Open - Source - Projekt und verwendet leicht erweitern Irony.net ).

Beantwortet am 06/08/2008 um 17:28
quelle vom benutzer

stimmen
5

Ich verwende LuaInterface1.3 + Lua 5.0 für eine NET 1.1-Anwendung.

Das Problem mit Boo ist, dass jedes Mal, wenn Sie analysieren / Kompilierung / eval Code on the fly, es eine Reihe von boo-Klassen erstellt, so dass Sie Speicherlecks erhalten.

Lua in der anderen Hand, tut nicht, dass, so dass es sehr, sehr stabil ist und funktioniert wunderbar (ich Objekte von C # zu Lua passieren kann und rückwärts).

Bisher habe ich legte es nicht in ART noch, aber es scheint sehr vielversprechend.

Ich habe Speicherlecks Probleme in ART mit LuaInterface + Lua 5,0 haben , deshalb habe ich Lua 5.2 und direkt in C # mit DllImport verknüpft. Die Speicherverluste waren in der LuaInterface Bibliothek.

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

Nachdem ich dies tat, alle meine Speicherlecks waren verschwunden und die Anwendung war sehr stabil.

Beantwortet am 17/07/2012 um 18:08
quelle vom benutzer

stimmen
5

Ich würde mit vorschlagen LuaInterface wie es Lua vollständig umgesetzt hat , wo es scheint , dass Nua nicht vollständig ist und wahrscheinlich nicht einige sehr nützliche Funktionalität (Koroutinen, etc.) nicht implementiert.

Wenn Sie einige der außerhalb fertig abgepackte Lua-Module verwenden mögen, würde ich mit etwas entlang der Linien von 1.5.x als zu der 2.x-Serie gegenüber, die vollständig verwalteten Code erstellt und den notwendigen C-API nicht aussetzen kann.

Beantwortet am 17/09/2008 um 02:41
quelle vom benutzer

stimmen
5

Sie könnten eine der DLR Sprachen verwenden, die einen Weg bieten, um wirklich Ihre eigene Scripting-Plattform leicht zu hosten. Allerdings müssen Sie nicht eine Skriptsprache für diese. Sie könnten C # und kompilieren Sie es mit dem C # -Code-Provider verwenden. Solange Sie es in seinem eigenen AppDomain laden, können Sie es zu Inhalt Ihres Herzens laden und entladen.

Beantwortet am 02/08/2008 um 07:16
quelle vom benutzer

stimmen
4

Die Hauptanwendung, die meine Abteilung verkauft tut etwas sehr ähnlich Client Anpassungen zur Verfügung zu stellen (was bedeutet, dass ich keine Quelle veröffentlichen kann). Wir haben eine C # Anwendung, die dynamischen VB.NET Skripte lädt (obwohl jede .NET-Sprache leicht unterstützt werden könnte - VB wurde gewählt, weil die Anpassung Team von einem ASP-Hintergrund kam).

Mit .NET des CodeDom kompilieren wir die Skripte aus der Datenbank, die mit VB CodeDomProvider(annoyingly wird standardmäßig .NET 2, wenn Sie 3.5 - Funktionen unterstützen möchten müssen Sie ein Wörterbuch passieren mit „Compiler“ = „v3.5“ an den Konstruktor ). Verwenden Sie die CodeDomProvider.CompileAssemblyFromSourceMethode , es zu kompilieren (Sie können die Einstellungen übergeben , um es zu zwingen nur im Speicher zu kompilieren.

Dies würde in Hunderten von Baugruppen im Speicher führen, aber man kann setzt alle Codes die dynamischen Klassen in eine einzige Baugruppe und neu kompiliert die ganze Menge bei jeder Änderung. Dies hat den Vorteil , dass Sie einen Flag hinzufügen könnten mit einer auf der Festplatte kompilieren PDB für , wenn Sie testen, so dass Sie durch den dynamischen Code debuggen.

Beantwortet am 10/08/2008 um 16:24
quelle vom benutzer

stimmen
4

Ja, ich dachte darüber nach, aber ich bald herausgefunden, dass eine andere Domain-Specific-Language (DSL) wäre ein bisschen zu viel sein.

Im Wesentlichen müssen sie mit meinem gamestate in möglicherweise unvorhersehbarer Weise zu interagieren. Zum Beispiel könnte eine Karte eine Regel haben „Wenn diese Karten ins Spiel kommen, werden alle Ihre untoten Diener +3 Angriff gegen fliegende Feinde gewinnen, es sei denn, der Feind ist gesegnet“. Als Sammelkartenspiele biegen basieren, wird die GameState-Manager OnStageX Ereignisse ausgelöst und die Karten ändern andere Karten oder die GameState in welcher Weise auch immer die -kartenbedarf lassen.

Wenn ich versuche, eine DSL zu schaffen, ich habe ein ziemlich großes Feature-Set implementieren und möglicherweise es ständig aktualisieren, was die Wartungsarbeiten zu einem anderen Teil verschiebt, ohne sie tatsächlich zu entfernen.

Deshalb hat ich mit einer „echten“ .NET-Sprache, um im wesentlichen der Lage sein, nur Feuer die Veranstaltung und lassen Sie die Karte manipuliert die gamestate in welcher Weise auch immer (im Rahmen der Codezugriffssicherheit) bleiben wollte.

Beantwortet am 02/08/2008 um 00:49
quelle vom benutzer

stimmen
3

Die nächste Version von .NET (5.0?) Hat über das Öffnen den „Compiler als Service“ viel geredet hat, die Dinge wie direkte Skript Auswertung möglich machen würde.

Beantwortet am 27/11/2010 um 03:12
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more