Dodawanie funkcjonalności skryptów to.NET aplikacje

Mam małą grę napisaną w C#. Używa bazy danych jako zaplecza. On a trading card game , i chciałem zaimplementować funkcję kart jako skrypt.

Chodzi mi o to, że zasadniczo mam Interfejs, ICard, który Klasa kart implementuje (public class Card056 : ICard) i który zawiera funkcje, które są wywoływane przez grę.

Teraz, Aby rzecz była utrzymywalna/moddable, chciałbym mieć klasę dla każdej karty jako kod źródłowy w bazie danych i zasadniczo skompiluj go przy pierwszym użyciu. Więc kiedy muszę dodać / zmienić kartę, po prostu dodam ją do bazy danych i powiem mojej aplikacji, aby odświeżyła, bez potrzeby wdrażania zestawu (zwłaszcza, że mówimy o 1 zestawie na kartę, co oznacza setki zestawów).

Czy to możliwe? Zarejestruj klasę z pliku źródłowego, a następnie utwórz jej instancję, itd.
ICard Cards[current] = new MyGame.CardLibrary.Card056();
Cards[current].OnEnterPlay(ref currentGameState);

Językiem jest C# , ale dodatkowy bonus, jeśli można napisać skrypt w dowolnym języku. NET.

Author: Peter Featherstone, 2008-08-02

9 answers

Rozwiązanie C# Script Olega Shilo (w projekcie Code) jest naprawdę świetnym wprowadzeniem do zapewniania możliwości skryptowych w Twojej aplikacji.

Innym podejściem byłoby rozważenie języka, który jest specjalnie zbudowany do skryptów, takich jak IronRuby, IronPython , lub Lua .

IronPython i IronRuby są dziś dostępne.

Poradnik do osadzania IronPython przeczytaj jak osadzić obsługę skryptów IronPython w swoim istniejąca aplikacja w 10 prostych krokach.

Lua jest językiem skryptowym powszechnie używanym w grach. Istnieje kompilator Lua dla. NET, dostępny z CodePlex -- http://www.codeplex.com/Nua

Ta baza kodowa jest świetną lekturą, jeśli chcesz dowiedzieć się o budowaniu kompilatora w .NET.

Zupełnie innym kątem jest wypróbowanie PowerShell . Istnieje wiele przykładów osadzania PowerShell w aplikacji - oto dokładny projekt na ten temat: Powershell Tunnel

 38
Author: Leon Bambrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-16 21:47:03

Możesz użyć do tego IronRuby.

W Przeciwnym Razie sugerowałbym posiadanie katalogu, w którym umieszczasz wstępnie skompilowane zespoły. Następnie możesz mieć w DB odniesienie do assembly i klasy i użyć reflection, aby załadować odpowiednie złożenia w czasie wykonywania.

Jeśli naprawdę chcesz skompilować w czasie wykonywania, możesz użyć CodeDOM, wtedy możesz użyć reflection, aby załadować dynamiczny skład. artykuł MSDN, który może pomóc.

 8
Author: Eric Haskins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-02 04:23:02

Możesz użyć dowolnego z języków DLR, które zapewniają możliwość łatwego hostowania własnej platformy skryptowej. Nie musisz jednak używać do tego języka skryptowego. Możesz użyć C# i skompilować go za pomocą dostawcy kodu C#. Tak długo, jak ładujesz go we własnej AppDomain, możesz załadować i rozładować go do zawartości serca.

 6
Author: Jesse Ezell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-02 06:16:23

Jeśli nie chcesz używać DLR możesz użyć Boo (który ma interpreter) lub możesz rozważyć Script.NET (s#) projekt na CodePlex . Dzięki rozwiązaniu Boo możesz wybierać pomiędzy skompilowanymi skryptami lub za pomocą interpretera, A Boo tworzy przyjemny język skryptowy, ma elastyczną składnię i rozszerzalny język dzięki otwartej architekturze kompilatora. Script.NET wygląda też ładnie, ale możesz łatwo rozszerzyć ten język, a także jego projekt open source i używa bardzo przyjaznego generatora kompilatora ( Irony.net).

 6
Author: Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-08 20:00:22

Sugerowałbym użycie LuaInterface ponieważ w pełni zaimplementował Lua, gdzie wydaje się, że Nua nie jest kompletna i prawdopodobnie nie implementuje niektórych bardzo przydatnych funkcji (coroutines, itp.).

Jeśli chcesz użyć niektórych zewnętrznych modułów Lua, sugerowałbym użycie czegoś w stylu 1.5.x w przeciwieństwie do 2.seria x, która buduje w pełni zarządzany kod i nie może udostępniać niezbędnego API C.

 5
Author: harningt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-17 01:41:29

Tak, myślałem o tym, ale wkrótce zorientowałem się, że inny język specyficzny dla domeny (DSL) będzie trochę za dużo.

Zasadniczo, muszą wchodzić w interakcję z moim gamestate w prawdopodobnie nieprzewidywalny sposób. Na przykład, karta może mieć zasadę "kiedy te karty wejdą do gry, wszyscy twoi nieumarli stronnicy zyskują + 3 Atak na latających wrogów, z wyjątkiem sytuacji, gdy wróg jest błogosławiony". Ponieważ gry karciane są turowe, Menedżer GameState uruchomi wydarzenia OnStageX i pozwoli kartom modyfikować inne karty lub GameState w dowolny sposób karta potrzebuje.

Jeśli próbuję stworzyć DSL, muszę zaimplementować dość duży zestaw funkcji i być może stale go aktualizować, co przenosi prace konserwacyjne do innej części bez jej usuwania.

Dlatego chciałem pozostać przy "prawdziwym" języku. NET, aby móc po prostu odpalić Zdarzenie i pozwolić karcie manipulować gamestate w dowolny sposób(w granicach bezpieczeństwa dostępu do kodu).

 5
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-26 15:39:08

Używam LuaInterface1. 3 + Lua 5.0 Dla aplikacji NET 1.1.

Problem z Boo polega na tym, że za każdym razem, gdy parsujesz/kompilujesz / evalujesz kod w locie, tworzy on zestaw klas boo, dzięki czemu będziesz miał wycieki pamięci.

Lua z drugiej strony tego nie robi, więc jest bardzo stabilny i działa wspaniale(mogę przekazywać obiekty z C# do Lua i Wstecz).

Do tej pory nie umieściłem tego w PROD, ale wydaje się bardzo obiecujące.

Miałem problemy z wyciekami pamięci w PROD using LuaInterface + Lua 5.0 , dlatego korzystałem z Lua 5.2 i linkowałem bezpośrednio do C# z DllImport. Wycieki pamięci były wewnątrz biblioteki LuaInterface.

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

Kiedy to zrobiłem, wszystkie wycieki pamięci zniknęły, a aplikacja była bardzo stabilna.

 5
Author: Kat Lim Ruiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-31 23:08:07

Główna aplikacja, którą sprzedaje mój dział, robi coś bardzo podobnego do personalizacji klienta(co oznacza, że nie mogę opublikować żadnego źródła). Mamy aplikację C#, która ładuje dynamicznie VB.NET Skrypty (chociaż każdy język. NET mógł być łatwo obsługiwany - wybrano VB, ponieważ zespół personalizacji pochodził z tła ASP).

Używając. NET ' s CodeDom kompilujemy skrypty z bazy danych, używając VB CodeDomProvider (domyślnie jest to. net 2, jeśli chcesz wspierać 3.5 funkcje musisz przekazać słownik z "CompilerVersion" = "v3.5" do jego konstruktora). Użyj metody CodeDomProvider.CompileAssemblyFromSource, aby ją skompilować (możesz przekazać ustawienia, aby wymusić kompilację tylko w pamięci.

Spowodowałoby to powstanie setek złożeń w pamięci, ale można by umieścić cały kod klas dynamicznych w jednym złożeniu i przekompilować całość w przypadku jakiejkolwiek zmiany. Ma to tę zaletę, że możesz dodać flagę do kompilacji na dysku za pomocą PDB podczas testowania, pozwala na debugowanie za pomocą dynamicznego kodu.

 4
Author: Keith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-09 22:58:08

Kolejna wersja. Net (5.0?) dużo mówił o otwarciu "kompilatora jako usługi", co umożliwiłoby bezpośrednią ocenę skryptu.

 3
Author: Eric Falsken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-27 09:33:16