【问题标题】:How do I force loading of a specific assembly into every application domain of an MVC 2 application?如何强制将特定程序集加载到 MVC 2 应用程序的每个应用程序域中?
【发布时间】:2011-10-12 15:19:36
【问题描述】:

我有一些松散耦合的代码,它们依赖于加载到当前应用程序域中的特定程序集:

Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().Where(
    candidateAssembly => candidateAssembly.FullName.StartsWith("Microsoft.WindowsAzure.ServiceRuntime")).SingleOrDefault();

并且该代码在 MVC 2 应用程序中执行并产生 null 引用,因为该程序集未加载到当前应用程序域中。我可以只从该程序集中调用一些代码,但这会引入应用程序代码对该程序集的强依赖性,并且我不再有松散耦合。

在我的代码运行之前,我需要强制 IIS(或其他任何东西)将该程序集加载到应用程序域中。我尝试编写IHttpModule 的实现并将其列在web.config 中,但没有帮助。

到目前为止,我尝试在<system.web><compilation><assemblies> 下添加程序集,看起来它可以工作,但我不确定它是否可靠。

如何在我的代码中不引入依赖项的情况下强制将该特定程序集加载到应用程序域中?

【问题讨论】:

  • Assembly.load 应该加载程序集,前提是您知道它的名称。 MEF 还具有查找和加载程序集 AFAIK 的方法
  • @Simon Halsey:这又是一个硬依赖,我想要一些不需要更改代码的东西。
  • 在这种情况下,我也会依赖依赖注入工具。例如,StructureMap 支持扫描特定目录中的程序集,非常适合那些“拖放”插件需求。

标签: .net asp.net asp.net-mvc iis reflection


【解决方案1】:

这是错误的方法,可能会导致严重的定时错误。

该设置会影响 ASP.NET 编译,因此它仅在编译 ASP.NET 视图并且它们最多编译一次时强制加载程序集 - 在第一次请求视图时或在就地预编译过程中,如果后者是设置。无论如何,会有一段时间不需要编译 ASP.NET 视图。

现在 IIS apppool 每 29 小时自动回收一次。当池回收时,它会启动一个新的工作进程,并且该进程开始托管站点有效负载。重要的是 ASP.NET 视图在此过程中不会更改,因此不需要重新编译它们,因此不会调用编译过程,因此不会强制加载 <system.web><compilation><assemblies> 中列出的程序集。

所以这东西看起来一直在工作,直到 29 小时过去了,然后它就崩溃了。

需要更好的解决方案。类似于<appSettings> 中的设置,说明 Azure 运行时是否应该可用。如果设置了该设置,则代码可以首次调用 Azure 运行时程序集中的代码,这将使它们加载。如果未设置设置,则不会尝试调用该代码。

【讨论】:

    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 1970-01-01
    • 2012-08-04
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    相关资源
    最近更新 更多