C# сценарии и безопасность

В свою игру (которая тоже написана на C#) я хочу включить какую-то поддержку настройки. Скорость меня очень беспокоит, так как я планирую перенести большую часть игрового процесса на скрипты. В результате я предпочитаю использовать C# для написания сценариев внутриигровых событий и прочего. Пользователи также должны иметь возможность писать сценарии и надстройки для игры на C#. (Кстати, я знаю, что С# НЕ является языком сценариев.)

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

Вот мои вопросы:

  1. Безопасность

    Как я могу гарантировать, что предоставленный код вынужден ТОЛЬКО вызывать материал предоставленного API (класса)? Чтобы предотвратить читерство со скриптами, вредоносные действия...

    Есть ли способ запустить скомпилированный код (ы) в своего рода виртуальной машине или среде с низким уровнем доверия?

  2. Скорость

    Будет ли этот подход достаточно быстрым? (Вызов функций из до 100 пользовательских сборок каждый или каждый второй кадр). Любые советы по этому поводу?

    Может быть, можно получить преимущество в скорости, скомпилировав весь пользовательский контент в одну большую сборку или что-то в этом роде??

  3. Размер

    Как я могу сделать скомпилированный код небольшим по размеру (помимо его сжатия)? Потому что игрокам может понадобиться скачать десятки скриптов...

    Есть ли способ убрать вещи, которые не являются абсолютно необходимыми? Например, отладочная информация или имена классов и тому подобное...

Компиляция среды выполнения для меня довольно нова (поэтому я спрашиваю здесь). Так что было бы неплохо указать на некоторые основные ошибки новичка и/или проблемы безопасности.

Редактировать:

Просто для пояснения: пользовательский плагин/скрипт или как бы вы его ни называли, это будет класс (также написанный на C#), который должен реализовывать определенные функции, такие как «GetAddonInfo», «Init», «Update»... Так же, как обычный класс C#, производный от моего абстрактного класса "Addon".


person Riki    schedule 22.08.2011    source источник


Ответы (2)


Вы хотите взглянуть на эту переработку старого примера проекта Microsoft.

http://terrarium2.codeplex.com/

Он в основном делает все, что вы хотите.

Компилирует код в библиотеки DLL и запускает их в среде

Проверяет разрешенные вызовы API.

и т. д.

Версия 2 была переписана для использования веб-сервисов и ряда других функций. Судя по вашему вопросу, вас может больше заинтересовать Террариум 1. Однако я не могу отследить его, поэтому вам, возможно, придется «довольствоваться» более сложной версией 2.0.

person Hogan    schedule 22.08.2011

Взгляните на MEF и MAF — обе платформы предназначены для добавления сценариев C# и VB в существующие приложения. Вы можете создать домен приложения для своих сценариев, а затем использовать защиту доступа для кода, чтобы строго ограничить возможности этих сценариев.

Этот вопрос может помочь.

Выбор между MEF и MAF (System.AddIn)

person Eric Lippert    schedule 22.08.2011