Přidání funkce skriptovací pro .NET aplikací

hlasů
62

Mám trochu hra napsaná v jazyce C #. Využívá databázi jako back-end. Je to karetní hra obchodování , a chtěl jsem realizovat funkci karet jako skript.

Co tím chci říct je, že jsem v podstatě mají rozhraní ICard, které o třídní karta implements ( public class Card056 : ICard) a který obsahuje funkce, které se nazývají hrou.

Nyní, aby se ta věc udržovatelné / moddable bych chtěl mít třídu pro každou kartu jako zdrojový kód v databázi a v podstatě sestavit ji při prvním použití. Takže když mám přidat / změnit kartu, budu jen přidat do databáze a říct mé žádosti osvěžit, aniž by bylo nutné jakékoliv nasazení sestavy (zejména proto, že bychom se mluví o 1 sestavu na kartě, což znamená stovky sestav) ,

Je to možné? Registrovat třídu ze zdrojového souboru a následně konkretizovat jej, atd.

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

Jazyk je C #, ale navíc bonus v případě, že je možné napsat skript v jakémkoli .NET jazyka.

Položena 02/08/2008 v 00:22
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
37

Oleg Shilo v C # řešení Script (The Project Code ) je opravdu skvělý úvod poskytovat skript schopnosti ve vaší aplikaci.

Odlišný přístup by se uvažovat o jazyk, který je speciálně postavený pro skriptování, jako je IronRuby , IronPython nebo Lua .

IronPython a IronRuby jsou oba jsou dnes k dispozici.

Za vodítko pro vkládání IronPython číst Jak vložit podporu skriptu IronPython ve své stávající aplikace v 10 snadných krocích .

Lua je skriptovací jazyk běžně používané ve hrách. K dispozici je Lua kompilátor pro .NET, k dispozici od CodePlex - http://www.codeplex.com/Nua

Že codebase je skvělý pro čtení, pokud se chcete dozvědět o budování kompilátor .NET.

Jiný úhel celkem je pokusit PowerShell . Existuje řada příkladů vkládání PowerShell do aplikace - zde je důkladný projekt na téma: Powershell Tunnel

Odpovězeno 02/08/2008 v 02:49
zdroj uživatelem

hlasů
7

Ty by mohly být schopni používat IronRuby za to.

Jinak bych naznačují, že máte adresář, kam umístit předkompilovaný sestavení. Pak byste mohli mít odkaz v DB na sestavení a třídy, a pomocí odrazu načíst správné sestavení v době běhu.

Pokud opravdu chcete sestavit při spuštění můžete použít CodeDOM, pak byste mohli použít odraz načíst dynamické sestavy. Článek MSDN, které by mohly pomoci .

Odpovězeno 02/08/2008 v 05:18
zdroj uživatelem

hlasů
6

Pokud si nechcete používat DLR můžete použít Boo (který má tlumočníka) , nebo byste mohli zvážit projekt Script.NET (S #) na CodePlex . S řešením Boo můžete si vybrat mezi vypracovaných scénářů nebo pomocí tlumočníka, a Boo dělá pěkný skriptovací jazyk, má pružnou syntaxi a rozšiřitelný jazyk prostřednictvím své otevřené architektuře kompilátoru. Script.NET vypadá hezky i když, a ty by mohly snadno rozšířit tento jazyk, stejně jako jeho open source projekt a používá velmi přátelský kompilátoru generátor ( Irony.net ).

Odpovězeno 06/08/2008 v 17:28
zdroj uživatelem

hlasů
5

Já používám LuaInterface1.3 + Lua 5.0 NET 1.1 aplikací.

Problém s Boo je, že pokaždé, když analyzovat / kompilace / eval kódu za běhu, že vytvoří sadu boo tříd, takže budete mít nevracení paměti.

Lua na druhou stranu, to nedělá, tak je to velice stabilní a funguje úžasné (mohu předat objekty z C # na Lua a dozadu).

Zatím jsem se dát do PROD ještě, ale zdá být velmi slibné.

Já jsem se nevrací paměť problémy ve fázi s použitím LuaInterface + Lua 5.0 , proto jsem použil Lua 5.2 a souvisí přímo do C # s DllImport. Netěsnosti paměť byli uvnitř knihovny LuaInterface.

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

Jednou jsem to udělal, všechny mé úniky paměti zmizely a aplikace je velmi stabilní.

Odpovězeno 17/07/2012 v 18:08
zdroj uživatelem

hlasů
5

Já bych navrhnout pomocí LuaInterface jak již plně implementován Lua, kde se zdá, že Nua není úplný a pravděpodobně neimplementuje některé velmi užitečné funkce (koprogram a podobně).

Chcete-li použít některé z venkovních balených modulů Lua, tak bych navrhnout pomocí něco podél řad 1.5.x, na rozdíl od 2.x série, která navazuje plně spravovaný kód a nelze vystavit potřebný C API.

Odpovězeno 17/09/2008 v 02:41
zdroj uživatelem

hlasů
5

Dalo by se použít některý z DLR jazyků, které poskytují způsob, jak skutečně snadno hostit svůj vlastní skriptovací platformy. Nicméně, nebudete muset použít skriptovací jazyk pro toto. Dalo by se použít C # a kompilace s poskytovatelem C # kódu. Tak dlouho, jak jej vložit do své vlastní AppDomain můžete nakládat a vykládat ji co hrdlo ráčí.

Odpovězeno 02/08/2008 v 07:16
zdroj uživatelem

hlasů
4

Hlavní aplikace, která má divize prodává dělá něco velmi podobného, ​​aby klientské customizace (což znamená, že nemohu psát jakýkoliv zdroj). Máme C # aplikace, která načte dynamické VB.NET skriptů (ačkoli nějaký NET jazyk může být snadno podporován - VB byl vybrán proto, že přizpůsobení tým přišel z ASP pozadí).

Práce s NET je CodeDOM bychom sestavit skripty z databáze pomocí VB CodeDomProvider(nechutně standard je NET 2, chcete-li podpořit 3.5 funkce, které je třeba předat slovník s „CompilerVersion“ = „v3.5“ do jeho konstruktor ). Použít CodeDomProvider.CompileAssemblyFromSourcemetodu ke kompilaci (můžete si projít nastavení vynutit sestavit pouze v paměti.

To by mělo za následek stovky sestav v paměti, ale můžete dát celý kód dynamického třídách společně do jedné sestavy, a překompilovat spoustu při jakékoliv změně. To má tu výhodu, že byste mohli přidat vlajku sestavit na disku s PNR , když jste testování, což vám umožní ladit pomocí dynamického kódu.

Odpovězeno 10/08/2008 v 16:24
zdroj uživatelem

hlasů
4

Ano, myslel jsem o tom, ale brzy jsem zjistil, že další Domain-Specific-Language (DSL), by bylo trochu moc.

V zásadě je třeba komunikovat se svým gamestate ve možná nepředvídatelným způsobem. Například karta může mít pravidlo „Když se tato přání vstoupit do hry, všichni vaši nemrtví nohsledi získat +3 útok proti nepřátelům létání, kromě případů, kdy se nepřítel požehnaný“. Jako obchodování karetní hry jsou zase založen, bude GameState Manažer oheň OnStageX události a nechat karty změnit jiné karty nebo GameState jakýmkoliv způsobem potřeby karet.

Když se pokusím vytvořit DSL, musím realizovat poměrně velkou sadu funkcí a případně neustále aktualizovat, což posouvá údržbářské práce na jiném místě, aniž by ve skutečnosti vyjmutí.

To je důvod, proč jsem chtěl zůstat s „skutečný“ .NET jazyka, v zásadě moci jen střílet události a nechat karty manipulovat gamestate jakýmkoli způsobem (v mezích bezpečnosti přístupového kódu).

Odpovězeno 02/08/2008 v 00:49
zdroj uživatelem

hlasů
3

Příští verze .NET (5,0?) Má za sebou hodně mluví o otevření „kompilátor jako služba“, který by dělal věci, jako je vyhodnocování direct skriptu je to možné.

Odpovězeno 27/11/2010 v 03:12
zdroj uživatelem

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