В моей игре (которая также написана на C #) я хочу включить некоторую поддержку настройки.
Скорость очень важна, так как я планирую перенести основные части игрового процесса в сценарии.
В результате я решил использовать C # для сценариев внутриигровых событий и прочего.
Пользователи также должны иметь возможность писать сценарии и дополнения для игры на C #.
(Я знаю, что C # НЕ является языком сценариев между прочим.)
Я предоставлю пользователям (статический) класс, который содержит все функции, необходимые для взаимодействия с игрой.
Пользователи также смогут предоставить код в качестве исходного кода (в этом случае игра скомпилирует его).
Скомпилировано Пользовательские "скрипты" могут / будут также передаваться другим игрокам в некоторых случаях.
Например, пользователь может встроить скриптовые ловушки в своем доме или где-либо еще.
Вот мои вопросы:
Безопасность
Как я могу гарантировать, что предоставленный код будет принудительно вызывать ТОЛЬКО материал из предоставленного API (класса)? Чтобы предотвратить мошенничество со скриптами, вредоносные действия ...
Есть ли способ запустить скомпилированный код (ы) в виде виртуальной машины или среды с низким уровнем доверия ??
Скорость
Будет ли этот подход достаточно быстрым? (Вызов функций из до 100 пользовательских сборок каждый или каждый второй кадр).
Любые советы по этому поводу?
Может быть, можно получить преимущество в скорости, скомпилировав весь пользовательский контент в одну большую сборку или что-то в этом роде?
размер
Как я могу сделать скомпилированный код небольшим по размеру (помимо сжатия)?
Потому что игрокам может понадобиться загрузить десятки скриптов ...
Есть ли способ убрать вещи, которые не являются абсолютно необходимыми? Как отладочная информация или имена классов и тому подобное ...
Компиляция во время выполнения является довольно новой для меня (вот почему я спрашиваю здесь). Поэтому было бы неплохо указать на некоторые серьезные ошибки новичка и / или проблемы безопасности.
Edit:
Только для уточнения:
Пользовательский плагин / скрипт или все, что вы хотели бы назвать, будет классом (также написанным на C #), который должен реализовывать определенные функции, такие как «GetAddonInfo», «Init», «Update» ...
Так же, как обычный класс C #, полученный из моего абстрактного класса «Addon».