Adăugarea de funcționalitate scripting pentru aplicații .NET

voturi
62

Am un mic joc scris în C #. Acesta folosește o bază de date de back-end. Este un joc de cărți de tranzacționare , și am vrut să pună în aplicare funcția de carduri ca un script.

Ceea ce vreau să spun este că am în esență , o interfață, ICardcare o pune în aplicare clasa carte ( public class Card056 : ICard) și care conține funcția pe care sunt numite de joc.

Acum, pentru a face lucrul mentenabil / moddable, aș dori să aibă clasă pentru fiecare card ca cod sursă în baza de date și compilați-l la prima utilizare în mod esențial. Așa că atunci când am pentru a adăuga / schimba o carte, o voi adăuga doar la baza de date și spune cererea mea pentru a actualiza, fără a avea nevoie de asamblare de implementare (mai ales că ne-ar fi vorba despre un ansamblu de euro pe card, ceea ce înseamnă sute de ansambluri) .

Este posibil? Înregistrează-o clasă dintr-un fișier sursă și apoi instanțiați-l, etc.

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

Limbajul este C #, dar bonus suplimentar dacă este posibil pentru a scrie script-ul în orice limbă .NET.

Întrebat 02/08/2008 la 00:22
sursa de către utilizator
În alte limbi...                            


9 răspunsuri

voturi
37

Oleg Shilo lui C # soluție Script (la Proiectul Codului ) , într - adevăr este o introducere mare de a furniza abilități de script în cererea dumneavoastră.

O altă abordare ar fi să se ia în considerare o limbă pe care este construit în mod specific pentru scripting, cum ar fi IronRuby , IronPython sau Lua .

IronPython și IronRuby sunt ambele disponibile în prezent.

Pentru un ghid pentru încorporarea IronPython citi Cum de a încorpora suport script - ul IronPython în aplicația existent în 10 pași simpli .

Lua este un limbaj de scripting utilizat în mod obișnuit în jocuri. Există un compilator Lua pentru .NET, disponibil de la CodePlex - http://www.codeplex.com/Nua

Aceasta este o bază de cod de citire mare, dacă doriți să învețe despre construirea unui compilator în .NET.

Un unghi cu totul diferit este de a încerca PowerShell . Există numeroase exemple de includere PowerShell într - o aplicație - aici e un proiect aprofundată pe tema: Powershell tunel

Publicat 02/08/2008 la 02:49
sursa de către utilizator

voturi
7

S-ar putea fi capabil de a utiliza IronRuby pentru asta.

În caz contrar, aș sugera să aveți un director în cazul în care plasați ansambluri precompilate. Atunci ai putea avea o referință în PB la asamblarea și clasă, și de a folosi reflecție pentru a încărca ansamblurile corespunzătoare în timpul rulării.

Dacă într-adevăr doriți să compilați la run-time ai putea folosi CodeDOM, atunci ai putea folosi de reflecție pentru a încărca ansamblul dinamic. Articolul MSDN care ar putea ajuta .

Publicat 02/08/2008 la 05:18
sursa de către utilizator

voturi
6

Dacă nu doriți să utilizați DLR puteți utiliza Boo (care are un interpret) sau ai putea lua în considerare proiectul Script.NET (S #) pe CodePlex . Cu soluția Boo puteți alege dintre script - uri compilate sau cu ajutorul interpretului, și Boo face un frumos limbaj de scripting, are o sintaxă flexibilă și un limbaj extensibil prin arhitectura sa compilator deschis. Script.NET arata prea frumos, deși, și ați putea extinde cu ușurință această limbă precum și de un proiect open source și folosește un generator de compilatoare foarte prietenos ( Irony.net ).

Publicat 06/08/2008 la 17:28
sursa de către utilizator

voturi
5

Sunt folosind LuaInterface1.3 + Lua 5.0 pentru NET 1.1 cerere.

Problema cu Boo este că de fiecare dată când analiza / compilare / eval codul pe zbor, se creează un set de clase boo astfel încât veți obține pierderi de memorie.

Lua în altă parte, nu face asta, așa că este foarte foarte stabil și funcționează minunat (I pot trece de la obiecte C # la Lua și înapoi).

Până în prezent, nu am pus-o în PROD încă, dar pare a fi foarte promițătoare.

Am avut probleme pierderi de memorie în PROD folosind LuaInterface + Lua 5.0 , de aceea am folosit Lua 5.2 și legat direct în C # cu DllImport. Scurgerile de memorie au fost în interiorul bibliotecii LuaInterface.

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

Odată ce am făcut acest lucru, toate scurgerile mele de memorie au dispărut, iar cererea a fost foarte stabil.

Publicat 17/07/2012 la 18:08
sursa de către utilizator

voturi
5

Aș sugera folosind LuaInterface cum a pus în aplicare pe deplin în cazul în care Lua se pare că Nua nu este completă și probabil nu pune în aplicare unele funcționalități foarte utile ( să aibă corutine, etc).

Dacă doriți să utilizați unele din afara modulelor Lua preambalate, aș sugera folosind ceva de-a lungul liniilor de 1.5.x, spre deosebire de seria 2.x, care se bazează pe deplin cod gestionat și nu poate expune C API-ul necesar.

Publicat 17/09/2008 la 02:41
sursa de către utilizator

voturi
5

Ai putea folosi oricare dintre limbile DLR, care oferă o modalitate de a găzdui într-adevăr ușor propria platforma de scripting. Cu toate acestea, nu trebuie să utilizați un limbaj de scripting pentru acest lucru. Ai putea folosi C # și compila-l cu furnizorul de cod C #. Atâta timp cât ați încărcat-o în propria AppDomain, puteți încărca și descărca-l la conținutul inimii.

Publicat 02/08/2008 la 07:16
sursa de către utilizator

voturi
4

Aplicația principală care vinde divizia de mea face ceva foarte similar pentru a furniza personalizări client (ceea ce înseamnă că nu pot posta orice sursă). Avem o aplicație # C, care încarcă script-uri dinamice VB.NET (deși orice limbaj NET ar putea fi acceptată cu ușurință - VB a fost ales pentru că echipa de personalizare a venit de la un fond ASP).

CodeDom Folosind .NET lui am compila script - urile din baza de date, folosind VB CodeDomProvider(supărător Aceasta are valoarea implicită .NET 2, dacă doriți să sprijine 3.5 caracteristici care aveți nevoie pentru a trece un dicționar cu „CompilerVersion“ = „v3.5“ pentru constructorul său ). Utilizați CodeDomProvider.CompileAssemblyFromSourcemetoda de a compila (puteți trece setările pentru a forța pentru a compila numai în memorie.

Acest lucru ar duce la sute de ansambluri în memorie, dar ai putea pune toate cod dinamice clase împreună într - un singur ansamblu, și recompilați întreg lot atunci când orice schimbare. Acest lucru are avantajul că ai putea adăuga un steag pentru a compila pe disc cu un PPB pentru atunci când testați, permițându - vă să depana prin codul dinamic.

Publicat 10/08/2008 la 16:24
sursa de către utilizator

voturi
4

Da, m-am gândit la asta, dar în curând am dat seama că un alt domeniu-specific-Language (DSL) ar fi un pic prea mult.

În esență, ei au nevoie pentru a interacționa cu gamestate meu într-un mod, eventual, imprevizibile. De exemplu, un card ar putea avea o regulă „Când acest joc intră carduri, toate minions-ul tău undead câștiga 3 atac împotriva dușmanilor care zboară, cu excepția cazului când inamicul este binecuvântat“. Ca jocuri de cărți de tranzacționare se bazează rândul său, GameState Managerul va declanșa OnStageX evenimente și lăsați cărțile să modifice alte carduri sau GameState în orice mod nevoile de card.

Dacă încerc să creez un DSL, trebuie să pună în aplicare un set de caracteristici destul de mare și, eventual, al actualiza în mod constant, ceea ce schimbă lucrările de întreținere la o altă parte, fără a scoate de fapt.

De aceea am vrut să rămână cu o limbă „adevărată“ .NET pentru a fi în măsură, în esență, la foc doar evenimentul și lăsați cardul manipula gamestate în orice mod (în limitele de securitate codul de acces).

Publicat 02/08/2008 la 00:49
sursa de către utilizator

voturi
3

Următoarea versiune de .NET (5.0?) A avut o mulțime de vorbesc despre deschiderea „compilator ca un serviciu“, care ar face lucruri, cum ar fi evaluarea directă script-ul este posibil.

Publicat 27/11/2010 la 03:12
sursa de către utilizator

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