Перекомпилируйте C # во время работы без доменов приложений

Позволять'скажем, у меня есть два приложения на C # -game.exe (XNA, должен поддерживать Xbox 360) иeditor.exe (XNA размещается в WinForms) - они оба разделяютengine.dll сборка, которая делает подавляющее большинство работы.

Теперь давайтескажем, я хочу добавить какой-нибудь сценарий на основе C # (этоне совсем "сценарии» но я'Я буду называть это так). Каждый уровень получает свой собственный класс, унаследованный от базового класса (мыпозвонюLevelController).

Вот важные ограничения для этих сценариев:

Они должны быть реальными, скомпилированными на C #

Они должны требовать минимального руководстваклей» работа, если есть

Они должны работать в том же AppDomain, что и все остальное

Для игры - это довольно просто: все классы сценариев могут быть скомпилированы в сборку (скажем,levels.dll) и отдельные классы могут быть созданы с использованием отражения по мере необходимости.

Редактор намного сложнее. Редактор имеет возможностьиграть в игру" в окне редактора, а затем сбросьте все обратно к тому месту, с которого оно начиналось (именно поэтому редактору необходимо знать об этих сценариях в первую очередь).

То, что я пытаюсь достичь, это в основном "перезагрузить скрипт кнопка в редакторе, которая перекомпилирует и загрузит класс скрипта, связанный с редактируемым уровнем и, когда пользователь нажимает кнопку "играть" Кнопка, создать экземпляр последнего скомпилированного скрипта.

Результатом будет быстрый рабочий процесс редактирования-тестирования в редакторе (вместо альтернативы - сохранения уровня, закрытия редактора, перекомпиляции решения, запуска редактора, загрузки уровня, тестирования).

Сейчас ясчитать Я разработал потенциальный способ достижения этого - который сам по себе приводит к ряду вопросов (приведенных ниже):

Скомпилируйте коллекцию.cs файлы, необходимые для данного уровня (или, если необходимо, всегоlevels.dll проект) во временную сборку с уникальным именем. На эту сборку нужно будет ссылатьсяengine.dll, Как вызвать компилятор таким образом во время выполнения? Как заставить его выводить такую сборку (и можно ли это сделать в памяти)?

Загрузите новую сборку. Будет ли иметь значение, что я загружаю классы с одинаковыми именами в один и тот же процесс? (У меня сложилось впечатление, что имена уточняются по имени сборки?)

Теперь, как я уже говорил, я могуt использовать домены приложений. Но, с другой стороны, я неНе обращайте внимания на утечку старых версий классов сценариев, так что возможность выгрузкиэто важно. Если это не так? Я'м, если предположить, что возможна загрузка нескольких сотен сборок.

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

И наконец:

Это разумный подход? Можно ли сделать это лучше?

ОБНОВЛЕНИЕ: В эти дни я используюгораздо более простой подход решить основную проблему.

Ответы на вопрос(4)

Ваш ответ на вопрос