2

Я пытаюсь написать модуль/систему плагинов для веб-сайта, над которым я работаю. Общие цели:ASP.Net MVC: как динамически загружать сборки (контроллеры) без перезапуска/повторного использования AppPool

  1. Чтобы новый сайт не перестраивался при каждом добавлении нового плагина.
  2. Чтобы иметь возможность выгружать файлы DLL и CSHTML в набор папок, которые в основном добавили бы набор маршрутов, контроллеров и других сборок, от которых зависит модуль (Entity Framework и т. Д.).
  3. Во избежание маркировки файлов плагинов как «встроенных ресурсов» - особенно видов.
  4. Чтобы иметь возможность добавлять и удалять эти модули/плагины БЕЗ необходимости перезапускать/перерабатывать пул приложений IIS или выгружать домен приложения.

Я получил # 1-3, работая, следуя примеру Umbraco. В принципе, я пометил метод с атрибутом PreApplicationStartMethod, и в нем я создаю теневые копии DLL и использую настраиваемый ViewEngine для поиска файлов CSHTML модуля. Когда мой сайт сначала запускается, мои контроллеры и представления моего модуля работают, а сборки загружаются: Ура!

Однако, когда пришло время, чтобы попробовать часть # 4, я получаю эту ошибку при вызове BuildManager.AddReferencedAssembly():

Этот метод может быть вызван только во время фазы инициализации предпусковой приложения. Используйте PreApplicationStartMethodAttribute для объявить метод, который будет вызываться в этой фазе

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

+0

привет, вы нашли какое-либо решение? –

ответ

0

«Для того, чтобы иметь возможность добавлять и удалять эти модули/плагины без необходимости перезагрузки/перерабатывают приложение IIS пул или выгрузить домен приложения ".

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

How to unload an assembly from the primary AppDomain?

0

Редактирование файла web.config при добавлении новых модулей должно привести к перекомпиляции сайта.

Вы можете автоматизировать это в сценарии, заставив ваши новые .dll скопировать в живой каталог временных файлов ASP.NET.

0

Проверьте портативные зоны. По существу, регулярная область MVC (включая представления, контроллеры и т. Д.) Скомпилируется в одну dll. Эти dll (по одному для каждой области) можно отбросить на веб-сайт хостинга MVC и вызываться как любая другая область MVC.

Некоторые ссылки для начала работы:

Portable Areas three years later – Part 5

MvcContrib Portable Areas

+0

Я прочитал статью, которую вы отправили, и, к сожалению, одним из шагов является добавление ссылки на основной проект и перекомпиляция. Развертывание приведет к перезапуску пула приложений.Это одна вещь, которую я пытаюсь избежать. – anon

+0

привет, вы нашли какое-либо решение? –