如何将特定程序集强制加载到MVC 2应用程序的每个应用程序域中



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

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

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

我需要强制IIS(或其他任何东西)在我的代码运行之前将该程序集加载到应用程序域中。我试着写一个IHttpModule的实现,并在web上列出它。

到目前为止,我试图在<system.web><compilation><assemblies>下添加组装,看起来像它的工作,但我不确定它是否可靠。

如何强制将特定程序集加载到应用程序域中而不在代码中引入依赖关系?

这是错误的方法,它会导致严重的时间错误。

设置影响ASP。. NET编译,因此它只在ASP. NET编译时强制加载程序集。. NET视图被编译,并且它们最多编译一次——要么是在对视图的第一次请求时编译,要么是在就地预编译过程中(如果设置了后者)编译。无论如何,总会有那么一段时间没有ASP。. NET视图需要编译。

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

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

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

相关内容

  • 没有找到相关文章

最新更新