ASP.NET 4 App dll是阴影复制但是加载了bin dll

时间:2014-07-09 07:12:31

标签: asp.net dll iis-7 shadow-copy

对于大型asp.net 4应用程序有一个非常奇怪的问题。 IIS有时会加载模块,而不是从卷影副本位置加载,而是加载dll最初来源的bin目录。

有谁知道IIS模块加载如何工作以及这是正常行为还是错误?

这导致我们的问题

  • 在开发中;相应的dll被锁定在bin文件夹中,这意味着msbuild无法在构建时替换它。
  • 这导致我们一个特别讨厌(并且很难找到)的问题(我们正在解决这个问题)我们在nhibernate queryovers中得到TypeMismatchException

备注

  • 在Win7&amp ;;上运行的ASP.NET 4应用程序WinServer2008R2,IIS 7.5,使用MVC3,MVC4,WebForms,WebApi的多个项目
  • 通过附加VS调试器和检查加载的模块来源的模块信息
  • 如果我IISIFET并清除临时asp.net文件文件夹然后将应用程序假脱机,那么dll将全部复制到卷影副本位置,然后从那里加载。如果我再次使用IISRESET并清空应用程序,则从bin位置加载模块而不是阴影复制位置
  • 这仅影响Web项目的项目依赖性,始终从卷影副本位置加载入口点。 IE Proj.Web 将从卷影副本位置加载,该项目依赖于 Proj.BusinessLogic & Proj.DataAccess 将从bin文件夹加载,外部依赖项(automapper,glimpse等)将从卷影副本位置加载。
  • 我们不会在代码,web.config或IIS配置(默认设置)中覆盖任何应用程序池或应用程序域配置。
  • 无法找到任何模块加载或应用启动被详细记录的地方。

1 个答案:

答案 0 :(得分:1)

几个星期前发现了这个问题的根本原因,现在发布,希望能帮助任何类似的人。

在我们的一些开发人员中发现了几个小时之后,我们发现这是由于我们正在扫描用于nhibernate配置的dll的方式而自行造成的。

当我们从代码中明确加载dll时,我们误用了Assembly辅助方法。我们使用Assembly.LoadFrom(assemblyPath)而不是Assembly.LoadFile(assemblyPath)。这些方法之间存在许多差异,这里相关的是LoadFile()加载指定的文件,而LoadFrom()将应用逻辑从其他位置(如temp,cache或GAC)查找程序集。有关差异的详细信息,请参阅this question

无论如何,在改变这一行代码之后,我们所有的问题都消失了。