Я разрабатываю платформу плагинов для ASP.NET MVC3 с использованием представлений Razor, и у меня возникает проблема с правильной работой встроенных представлений.
Плагиновая структура предназначена для использования этих функций:
- Каждый плагин имеет свои собственные модели, контроллеры и представления. Представления представляют собой встроенные ресурсы, а контроллеры - из класса PluginController
- У плагинов есть ссылки зависимостей на общую библиотеку классов, которая определяет базовый класс PluginController
- Веб-приложение "shell", в котором размещаются плагины , не должно содержать ссылки на любые плагины во время разработки, так как во время разработки он не знает, какие плагины он имеет.
- Плагины dll отбрасываются в папку в приложении оболочки, которая не папка /bin
- Корпус заботится:
- Обнаружение плагинов (с использованием отражения)
- Регистрация всех контроллеров (я использую Spring.Net для этого)
- Создание маршрутов к контроллерам
- Обслуживание файлов бритвы (cshtml) через пользовательский VirtualPathProvider
Теперь все работает нормально, за исключением случаев, когда встроенные представления имеют ссылки на типы в DLL плагина. Затем я получаю печально известную ошибку (имена опущены):
The type or namespace name '[Plugins]' does not exist in the namespace '[MyPluginSolution]' (are you missing an assembly reference?)
Причиной этого является то, что компилятор csc, который вызывается во время выполнения для компиляции представлений бритвы , получает только ссылки dll из папки bin и GAC.
Я также пробовал предварительно компилировать представления, используя эту технику, но в итоге он дает те же результаты, поскольку среда выполнения настаивает на компиляция обертки для предварительно скомпилированного бритва.
Я мог бы, конечно, удалить dll плагина в папку /bin, но мой вопрос:
Есть ли способ зарегистрировать DLL файлы в папке, отличной от bin (и не-GAC), и рассматривать их как "граждан первого класса", чтобы их можно было использовать в виде бритвы?