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

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

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

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

Это возможно? Зарегистрируйте class из исходного файла, а затем создайте его и т. Д.

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

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

    Решение C # Script от Oleg Shilo (в проекте Code ) действительно представляет собой отличное введение в возможности создания скриптов в вашем приложении.

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

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

    Руководство по внедрению IronPython read Как встроить поддержку скрипта IronPython в существующее приложение за 10 простых шагов .

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

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

    Другой подход – попробовать PowerShell . Существует множество примеров внедрения PowerShell в приложение – вот подробный проект по теме: Tunnelhell Tunnel

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

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

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

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

    Если вы не хотите использовать 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 Manager будет запускать события OnStageX и позволить карточкам изменять другие карты или GameState любым способом, который нужен карте.

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

    Вот почему я хотел остаться с «реальным» языком .NET, чтобы, по сути, просто запустить это событие и позволить карточке манипулировать игрой игры любым способом (в пределах безопасности доступа к коду).

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

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

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

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

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

    Lua 5.2: от 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 для его компиляции (вы можете передать настройки, чтобы заставить его компилироваться только в памяти.

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

    В следующей версии .NET (5.0?) Было много разговоров об открытии «компилятора в качестве сервиса», что сделало бы возможным использование возможности прямого сценария.

    Interesting Posts

    Как преобразовать строку в CharSequence?

    Почему .ToString () в нулевой строке вызывает нулевую ошибку, когда .ToString () отлично работает в nullable int с нулевым значением?

    Почему вы используете Expression <Func >, а не Func ?

    Поведение без знакового сдвига вправо для байтовой переменной

    Рисование формы волны с помощью AVAssetReader

    Как использовать инструкции Fused Multiply-Add (FMA) с SSE / AVX

    Проложить трафик через определенный интерфейс для процесса в Linux

    Использование переменной в качестве значения по умолчанию в vars_prompt в Ansible

    Как сериализовать статические элементы данных classа Java?

    iPhone: изменение языка клавиатуры

    Android + MySQL с помощью com.mysql.jdbc.Driver

    Самый простой способ преобразования коллекции в массив?

    Оптимизировать диапазон запросов времени печати Postgres

    JSTL / JSP EL (язык выражений) в контексте не JSP (автономный)

    Использование типов сборки в Gradle для запуска того же приложения, которое использует ContentProvider на одном устройстве

    Давайте будем гением компьютера.