Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1725
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Добавление функциональности сценариев в приложения .NET
У меня есть небольшая игра, написанная в C#., она использует базу данных в качестве бэк-энда. Это это была торговая карточная игра, и я хотел реализовать функцию карт в виде скрипта.
Я имею в виду, что у меня по существу есть интерфейс , ICard, который реализует класс карт ( public class Card056: ICard ) и который содержит функцию, вызываемую игрой.
Теперь, чтобы сделать вещь maintainable/moddable,, я хотел бы иметь класс для каждой карты в качестве исходного кода в базе данных и по существу скомпилировать его при первом использовании. Поэтому, когда мне нужно добавить/изменить карту, я просто добавлю ее в базу данных и скажу своему приложению обновить, не требуя никаких assembly deployment (тем более, что мы будем говорить о 1 assembly на карту, что означает сотни сборок).
Разве это возможно? Зарегистрируйте класс из исходного файла, а затем создайте его экземпляр и т. д.
ICard Cards[current] = new MyGame.CardLibrary.Card056();
Cards[current].OnEnterPlay(ref currentGameState);
Язык C#, но дополнительный бонус, если есть возможность написать сценарий на любом языке .NET.
Решение Олега Шило C# Script (в проекте Code) действительно является отличным введением в предоставление возможностей скрипта в вашем приложении.
Другой подход заключается в рассмотрении языка, который специально создан для сценариев, таких как IronRuby , IronPython или Lua .
IronPython и IronRuby доступны сегодня.
Для получения руководства по встраиванию IronPython прочитайте Как встроить поддержку скриптов IronPython в существующее приложение за 10 простых шагов .
Lua-это язык сценариев, обычно используемый в играх. Существует компилятор Lua для .NET, доступный из CodePlex -- http://www.codeplex.com/Nua
Эта кодовая база является отличным чтением, если вы хотите узнать о создании компилятора .NET.
Совсем другой угол зрения-это попробовать PowerShell . Существует множество примеров внедрения PowerShell в приложение - вот подробный проект по этой теме: Powershell туннель
Вы могли бы использовать для этого IronRuby.
В противном случае я бы предложил вам иметь каталог, в котором вы размещаете предварительно скомпилированные сборки. Затем вы можете иметь ссылку в DB на assembly и класс и использовать отражение для загрузки соответствующих сборок во время выполнения.
Если вы действительно хотите выполнить компиляцию во время выполнения, вы можете использовать CodeDOM, а затем использовать отражение для загрузки динамического assembly. Статья документации Microsoft, которая может помочь .
Если вы не хотите использовать DLR, вы можете использовать Boo (который имеет интерпретатор) или вы можете рассмотреть проект Script.NET (S#) на CodePlex . С помощью решения Boo вы можете выбирать между скомпилированными скриптами или с помощью интерпретатора, и Boo делает хороший язык сценариев, имеет гибкий синтаксис и расширяемый язык через свою открытую архитектуру компилятора. Script.NET тоже выглядит неплохо, и вы можете легко расширить этот язык, а также его проект с открытым исходным кодом и использовать очень дружественный генератор компиляторов ( Irony.net ).
Вы можете использовать любой из языков DLR, которые предоставляют возможность действительно легко разместить свою собственную скриптовую платформу. Однако для этого не обязательно использовать язык сценариев. Вы можете использовать C# и скомпилировать его с помощью поставщика кода C#. Пока вы загружаете его в свой собственный AppDomain, вы можете загружать и выгружать его в свое удовольствие.
Я бы предложил использовать LuaInterface , поскольку он полностью реализовал Lua, где, как представляется, Nua не является полным и, вероятно, не реализует некоторые очень полезные функции (coroutines и т. д.).
Если вы хотите использовать некоторые из внешних готовых модулей Lua, я бы предложил использовать что-то вроде 1.5.x в отличие от серии 2.x, которая строит полностью управляемый код и не может предоставить необходимый C API.
Я использую LuaInterface1.3 + Lua 5.0 для NET 1.1 приложения.
Проблема с Boo заключается в том, что каждый раз, когда вы parse/compile/eval свой код на лету, он создает набор классов 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
Как только я это сделал, все мои утечки памяти исчезли, и приложение было очень стабильным.
Да, я думал об этом, но вскоре понял, что еще один Domain-Specific-Language (DSL) будет немного чересчур.
По сути, они должны взаимодействовать с моим геймстейтом, возможно, непредсказуемым образом. Например, у карты может быть правило: "когда эти карты входят в игру, все ваши немертвые миньоны получают +3 атаки против летающих врагов, за исключением тех случаев, когда враг благословлен". Поскольку торговые карточные игры являются пошаговыми, менеджер GameState будет запускать события OnStageX и разрешать картам изменять другие карты или GameState в любом случае, в котором нуждается карта.
Если я попытаюсь создать DSL, мне придется реализовать довольно большой набор функций и, возможно, постоянно обновлять его, что переносит работу по обслуживанию на другую часть, фактически не удаляя ее.
Вот почему я хотел остаться с языком "real" .NET, чтобы по существу иметь возможность просто запустить событие и позволить карте манипулировать gamestate любым способом (в пределах безопасности доступа к коду).
Основное приложение, которое продает мой отдел, делает что-то очень похожее на предоставление клиентских настроек (что означает, что я не могу опубликовать какой-либо источник). У нас есть приложение C#, которое загружает динамические скрипты VB.NET (хотя любой язык .NET может быть легко поддержан - VB был выбран потому, что команда настройки исходила из фона ASP).
Используя .NET's CodeDom, мы компилируем скрипты из базы данных, используя VB CodeDomProvider (досадно, что по умолчанию он имеет значение .NET 2, Если вы хотите поддерживать функции 3.5, вам нужно передать словарь с "CompilerVersion" = " v3.5 " его конструктору). Используйте метод CodeDomProvider.CompileAssemblyFromSource для его компиляции (вы можете передать настройки, чтобы заставить его компилироваться только в памяти.
Это привело бы к сотням сборок в памяти, но вы могли бы собрать весь код динамических классов вместе в один assembly и перекомпилировать всю партию при любом изменении. Это имеет то преимущество, что вы можете добавить флаг для компиляции на диске с PDB для тестирования, что позволит вам отлаживать динамический код.