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

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

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

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

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

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

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

64 голоса | спросил Michael Stum 2 AM00000030000000831 2008, 03:22:08

9 ответов


0

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

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

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

Для руководства по внедрению IronPython прочитайте Как встроить поддержку сценариев IronPython в существующее приложение за 10 простых шагов .

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

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

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

ответил Leon Bambrick 2 AM00000050000004631 2008, 05:49:46
0

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

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

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

ответил Eric Haskins 2 AM00000080000001531 2008, 08:18:15
0

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

ответил Jesse Ezell 2 AM000000100000002331 2008, 10:16:23
0

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

ответил Nathan 6 PM00000080000001931 2008, 20:28:19
0

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

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

ответил harningt 17 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 17 Sep 2008 05:41:29 +0400 2008, 05:41:29
0

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

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

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

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

ответил Michael Stum 2 AM00000030000005731 2008, 03:49:57
0

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

Проблема с Boo в том, что каждый раз, когда вы анализируете /компилируете /проверяете свой код на лету, он создает набор классов 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 /загрузить

После этого все утечки памяти исчезли, и приложение стало очень стабильным.

ответил Kat Lim Ruiz 17 J000000Tuesday12 2012, 21:08:51
0

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

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

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

ответил Keith 10 PM00000070000002331 2008, 19:24:23
0

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

ответил Eric Falsken 27 62010vEurope/Moscow11bEurope/MoscowSat, 27 Nov 2010 05:12:59 +0300 2010, 05:12:59

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132