我正在尝试为我正在开发的网站编写模块/插件系统。总体目标是:
- 每次添加新插件时不必重新编译主网站。
- 为了能够将 DLL 和 CSHTML 文件转储到一组文件夹中,这些文件夹基本上会添加一组路由、控制器和模块所依赖的任何其他程序集(实体框架等)。
- 避免将插件文件标记为“嵌入式资源”——尤其是视图。
- 为了能够添加和删除这些模块/插件,而无需重新启动/回收 IIS 应用程序池或卸载应用程序域。
我按照 Umbraco 的例子得到了 #1-3 的工作。基本上,我用PreApplicationStartMethod
属性标记了一个方法,并在其中复制 DLL,并使用自定义 ViewEngine 来定位模块的 CSHTML 文件。当我的网站第一次启动时,我的模块的控制器和视图正在工作,并且程序集已加载:万岁!
但是,当需要尝试第 4 部分时,调用时出现此错误BuildManager.AddReferencedAssembly()
:
该方法只能在应用程序的预启动初始化阶段调用。使用 PreApplicationStartMethodAttribute 声明将在该阶段调用的方法
到目前为止,这是一个非常令人沮丧的过程,我的直觉告诉我,这个错误意味着一个死胡同。是这种情况,还是有聪明的解决方法?