Добавление функциональности сценариев to.NET приложения


у меня есть небольшая игра, написанная на C#. Он использует базу данных в качестве серверной. Это а коллекционная карточная игра, и я хотел реализовать функцию карт в виде скрипта.

Я имею в виду, что у меня по существу есть интерфейс,ICard, который реализует класс карты (public class Card056 : ICard) и который содержит функции, которые вызываются игрой.

Теперь, чтобы сделать вещь ремонтопригодной / модулируемой, я хотел бы иметь класс для каждой карты в качестве исходного кода в база данных и по существу скомпилировать его при первом использовании. Поэтому, когда мне нужно добавить/изменить карту, я просто добавлю ее в базу данных и скажу своему приложению обновить, не требуя развертывания сборки (тем более, что мы будем говорить о 1 сборке на карту, что означает сотни сборок).

это возможно? Зарегистрировать класс из исходного файла, а затем создать его экземпляр и т. д.

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

язык C# но дополнительный бонус, если можно написать скрипт на любом языке .NET.

9 63

9 ответов:

решение скрипта C# Олега шило (в проекте кода) действительно является отличным введением в предоставление возможностей скрипта в вашем приложении.

другой подход заключается в рассмотрении языка, который специально создан для сценариев, таких как IronRuby,IronPython или Lua.

IronPython и IronRuby доступны сегодня.

для руководства по встраиванию IronPython читать как чтобы встроить поддержку скриптов IronPython в существующее приложение, выполните 10 простых шагов.

Lua-это язык сценариев, обычно используемый в играх. Существует компилятор Lua для .NET, доступный из CodePlex -- http://www.codeplex.com/Nua

эта кодовая база отлично читается, если вы хотите узнать о создании компилятора в. NET.

совсем другой угол-это попробовать PowerShell. Существует множество примеров внедрения PowerShell в приложение -- вот подробный проект по этой теме: Туннель Powershell

вы могли бы использовать IronRuby для этого.

в противном случае я бы предложил вам иметь каталог, где вы размещаете предварительно скомпилированные сборки. Затем вы можете иметь ссылку в БД на сборку и класс и использовать отражение для загрузки соответствующих сборок во время выполнения.

Если вы действительно хотите скомпилировать во время выполнения, Вы можете использовать CodeDOM, затем вы можете использовать отражение для загрузки динамической сборки. MSDN статья, которая может помочь.

вы можете использовать любой из языков DLR, которые обеспечивают способ действительно легко разместить свою собственную платформу сценариев. Однако для этого вам не нужно использовать язык сценариев. Вы можете использовать C# и скомпилировать его с поставщиком кода C#. Пока вы загружаете его в свой собственный домен приложений, вы можете загружать и выгружать его в свое удовольствие.

Если вы не хотите использовать DLR, вы можете используйте Boo (который имеет интерпретатор) или вы могли бы рассмотреть Script.NET (S#) проект на CodePlex. С помощью решения Boo вы можете выбирать между скомпилированными скриптами или с помощью интерпретатора, а Boo делает хороший язык сценариев, имеет гибкий синтаксис и расширяемый язык с помощью своей открытой архитектуры компилятора. Script.NET выглядит тоже неплохо, хотя, и вы можете легко расширить этот язык, а также его открытый исходный проект и использует очень дружественный генератор компилятора (Irony.net).

Я бы предложил использовать LuaInterface поскольку он полностью реализовал Lua, где кажется, что Nua не является полным и, вероятно, не реализует некоторые очень полезные функции (сопрограммы и т. д.).

Если вы хотите использовать некоторые из внешних готовых модулей Lua, я бы предложил использовать что-то вроде 1.5.x в отличие от 2.серия x, которая строит полностью управляемый код и не может предоставить необходимый C API.

Да, я думал об этом, но вскоре понял, что другой доменный язык (DSL) будет немного слишком много.

по сути, они должны взаимодействовать с моим gamestate, возможно, непредсказуемыми способами. Например, у карты может быть правило "когда эти карты входят в игру, все ваши немертвые миньоны получают +3 атаки против летающих врагов, за исключением тех случаев, когда враг благословлен". Поскольку карточные игры являются пошаговыми, менеджер GameState будет запускать события OnStageX и позволять карты изменяют другие карты или состояние игры любым способом, который требуется карте.

Если я попытаюсь создать DSL, мне придется реализовать довольно большой набор функций и, возможно, постоянно обновлять его, что переносит работу по обслуживанию на другую часть, фактически не удаляя ее.

вот почему я хотел остаться с "реальным" языком .NET, чтобы по существу иметь возможность просто запустить событие и позволить карте манипулировать gamestate любым способом (в пределах доступа к коду безопасность.)

Я использую LuaInterface1.3 + Lua 5.0 для приложения NET 1.1.

проблема с Boo заключается в том, что каждый раз, когда вы анализируете/компилируете/оцениваете свой код на лету, он создает набор классов boo, поэтому вы получите утечки памяти.

Lua с другой стороны, не делает этого, поэтому он очень стабилен и работает замечательно (я могу передавать объекты из C# в Lua и обратно).

до сих пор я еще не поставил его в PROD, но кажется очень многообещающим.

I были ли проблемы с утечкой памяти в PROD с использованием LuaInterface + Lua 5.0, поэтому я использовал Lua 5.2 и напрямую связан с C# с DllImport. утечки памяти были внутри библиотеки LuaInterface.

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

Как только я это сделал, все мои утечек памяти было и приложение было очень стабильный.

основное приложение, которое продает мое подразделение, делает что-то очень похожее на предоставление клиентских настроек (что означает, что я не могу опубликовать какой-либо источник). У нас есть приложение на C#, которое загружает динамические VB.NET скрипты (хотя любой язык .NET может быть легко поддержан - VB был выбран потому, что команда настройки исходила из фона ASP).

С помощью .NET CodeDom мы компилируем скрипты из базы данных, используя VB CodeDomProvider (досадно это по умолчанию .NET 2, Если вы хотите для поддержки 3.5 функций вам нужно передать словарь с "CompilerVersion" = "v3.5" в его конструктор). Используйте CodeDomProvider.CompileAssemblyFromSource метод для его компиляции (вы можете передать настройки, чтобы заставить его компилироваться только в памяти.

это приведет к сотням сборок в памяти, но вы можете объединить весь код динамических классов в одну сборку и перекомпилировать всю партию при любом изменении. Это имеет то преимущество, что вы можете добавить флаг для компиляции на диске с помощью PDB для того, когда вы тестируете, что позволяет отлаживать через динамический код.

следующая версия .NET (5.0?) было много разговоров об открытии "компилятора как сервиса", который сделал бы такие вещи, как прямая оценка скрипта.