【问题标题】:ASP.Net MVC: How to dynamically load assemblies (controllers) without an AppPool restart/recycleASP.Net MVC:如何在没有 AppPool 重启/回收的情况下动态加载程序集(控制器)
【发布时间】:2013-05-01 01:59:32
【问题描述】:

我正在尝试为我正在开发的网站编写模块/插件系统。总体目标是:

  1. 每次添加新插件时不必重新编译主网站。
  2. 能够将 DLL 和 CSHTML 文件转储到一组文件夹中,这些文件夹基本上会添加一组路由、控制器和模块所依赖的任何其他程序集(实体框架等)。
  3. 为了避免将插件文件标记为“嵌入式资源”——尤其是视图。
  4. 能够添加和删除这些模块/插件,而无需重新启动/回收 IIS 应用程序池或卸载应用程序域。

按照 Umbraco 的示例,我得到了 #1-3 的工作。基本上,我用PreApplicationStartMethod 属性标记了一个方法,并在其中复制了DLL,并使用自定义ViewEngine 来定位模块的CSHTML 文件。当我的网站第一次启动时,我的模块的控制器和视图正在工作,并且程序集已加载:万岁!

但是,在尝试第 4 部分时,我在调用 BuildManager.AddReferencedAssembly() 时收到此错误:

此方法只能在应用程序预启动期间调用 初始化阶段。使用 PreApplicationStartMethodAttribute 来 声明将在该阶段调用的方法

到目前为止,这是一个非常令人沮丧的过程,我的直觉告诉我,这个错误意味着一条死胡同。是这种情况,还是有巧妙的解决方法?

【问题讨论】:

  • 嗨,你找到解决办法了吗?

标签: asp.net-mvc plugins module .net-assembly application-pool


【解决方案1】:

在添加新模块时编辑 web.config 文件应该会导致站点重新编译。

您可以在脚本中自动执行此操作,强制将新的 .dll 复制到实时 ASP.NET 临时文件目录。

【讨论】:

    【解决方案2】:

    查看便携式区域。本质上,一个常规的 MVC 区域(包括视图、控制器等)被编译成一个 dll。这些 dll(每个区域一个)可以放入托管 MVC 网站,并且可以像任何其他 MVC 区域一样调用。

    一些入门参考:

    Portable Areas three years later – Part 5

    MvcContrib Portable Areas

    【讨论】:

    • 我看了你发的那篇文章,不幸的是其中一个步骤是添加对主项目的引用并重新编译。部署将导致应用程序池重新启动。这是我试图避免的一件事。
    • 嗨,你找到解决办法了吗?
    【解决方案3】:

    “能够添加和删除这些模块/插件,而无需重新启动/回收 IIS 应用程序池或卸载应用程序域。”

    事实证明,您无法从应用程序域中卸载程序集。

    How to unload an assembly from the primary AppDomain?

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2021-09-26
      • 1970-01-01
      • 2023-04-03
      • 2011-05-11
      • 2019-12-15
      • 2014-10-10
      相关资源
      最近更新 更多