DLL版本控制错误

我有一个偶尔会抛出以下错误的网站:

‘/’应用程序中的服务器错误。

无法加载文件或程序集’ICSharpCode.SharpZipLib,Version = 0.85.3.365,Culture = neutral,PublicKeyToken = 1b03e6acf1164f73’或其依赖项之一。 定位的程序集的清单定义与程序集引用不匹配。 (HRESULTexception:0x80131040)

现在我知道我确实依赖于这个DLL,但我的系统上有0.85.5版本。 我已经从服务器系统地删除了每个旧版本的DLL,重新编译了所有内容并重新发布。 但无论我做什么,似乎每次重新发布后,有人访问该网站的前一两次,他们都会收到此错误。 然后刷新一次或两次后,错误消失,网站正常运行。

让我更奇怪的是,如果我查看抛出错误的代码行:

URLRewriter.ProcessRewritingResult(status, excludedEnum, siteName, viewMode, relativePath); 

URLRewriter是来自第三方软件包( Kentico CMS – CMS.URLRewritingEngine.dll)的类。 我在该DLL上运行了Dependency Walker,并且在ICSharpCode.SharpZipLib上找不到任何依赖项。

任何想法如何解决这一问题?

编辑:在@ JeremyThompson的建议下,我运行了Process Monitor来捕获错误。 这是一个屏幕转储,突出显示相关部分(出于隐私原因,一个文件夹名称被隐藏)。 您可以通过右键单击它来查看它的完整大小等…

在此处输入图像描述

编辑:这是错误的负载跟踪。 这有帮助吗?

===预绑定状态信息===

日志:用户= MY-SERVER-12 \管理员

日志:DisplayName = ICSharpCode.SharpZipLib,Version = 0.85.3.365,Culture = neutral,PublicKeyToken = 1b03e6acf1164f73(完全指定)

日志:Appbase = file:/// C:/ inetpub / wwwroot / MySite /

日志:初始PrivatePath = C:\ inetpub \ wwwroot \ MySite \ bin

调用程序集:CMS.WebAnalytics,Version = 6.0.4377.2467,Culture = neutral,PublicKeyToken = 834b12a258f213f9。

===

日志:此绑定在默认加载上下文中启动。

日志:使用应用程序配置文件:C:\ inetpub \ wwwroot \ MySite \ web.config

日志:使用主机配置文件:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ aspnet.config

日志:使用C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ config \ machine.config中的计算机配置文件。

日志:政策后参考:ICSharpCode.SharpZipLib,Version = 0.85.3.365,Culture = neutral,PublicKeyToken = 1b03e6acf1164f73

日志:尝试下载新的URL文件:/// C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files / root / 9760eb69 / 275bb3db / ICSharpCode.SharpZipLib.DLL。

日志:尝试下载新的URL文件:/// C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files / root / 9760eb69 / 275bb3db / ICSharpCode.SharpZipLib / ICSharpCode.SharpZipLib.DLL。

日志:尝试下载新的URL文件:/// C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib.DLL。

日志:尝试下载新的URL文件:/// C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.DLL。

日志:尝试下载新的URL文件:/// C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files / root / 9760eb69 / 275bb3db / ICSharpCode.SharpZipLib.EXE。

日志:尝试下载新的URL文件:/// C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files / root / 9760eb69 / 275bb3db / ICSharpCode.SharpZipLib / ICSharpCode.SharpZipLib.EXE。

日志:尝试下载新的URL文件:/// C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib.EXE。

日志:尝试下载新的URL文件:/// C:/inetpub/wwwroot/MySite/bin/ICSharpCode.SharpZipLib/ICSharpCode.SharpZipLib.EXE。

现在我知道我确实依赖于这个DLL,但我的系统上有0.85.5版本。 我已经从服务器系统地删除了每个版本的DLL,重新编译了所有内容并重新发布。

听起来像’依赖’期待DLL的OLDER版本。 为什么不使用OLDER版本(0.85.3.365) 更换系统上NEWER版本(0.85.5)的所有副本? (确保检查Web应用程序的’bin’文件夹和’GAC’:c:\ windows \ assemblies)

如果您需要,可以在此处下载旧版本: http : //sourceforge.net/projects/sharpdevelop/files/SharpZipLib/0.85.3/

注意:

  • 更换DLL后,停止IIS并清除所有临时ASP.Net文件。 例如:C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET Files
  • 另请注意:请记住更新Visual Studio解决方案,以便它引用旧版本。

干杯

皮特

您提到用户访问该网站的前一次或两次您会收到错误。

为了解决这个问题,我建议你运行Process Monitor ,看看它在哪里找到并加载程序集。

-iisreset
-start服务器上的Process Monitor
– 查看几页并尽快重现问题
– 停止ProcessMonitor跟踪
– 在ICSharpCode.SharpZipLib的进程监视器跟踪中ICSharpCode.SharpZipLib

如果失败了,看看还有什么原因:

– 将ProcessMonitor结果保存为CSV
– 在Excel中打开CSV
-filter所有列
– 选择拒绝访问的列的下拉列表或…

这应该告诉您错误Could not load file or assembly

事实certificate,Kentico有自己对ICSharpCode.SharpZipZip.dll的依赖 – 而且它期望找到旧版本。 我在这里找到了类似的解决方案 通过将以下块插入我的web.config文件,似乎我终于消除了这个错误!

         

我仍然不明白的是,为什么Dependency Tracker没有显示出这种依赖?

编辑:哦,亲爱的,毕竟这并没有解决它。 它现在似乎发生的频率较低,但今天重新启动IIS后,我们的一位测试人员再次收到了旧的错误消息! 🙁

我认为你在绑定重定向方面处于正确的轨道上。 但是,我建议您不要将应用程序与旧版本绑定,而是尝试将依赖程序集与新版本绑定。

通常,强制使用旧版本是更糟糕的选择,因为虽然它可能会修复depdenent程序集,但是您可以将兼容性错误注入到依赖于较新版本的代码中。

尝试附加到AppDomain.CurrentDomain.AssemblyResolve,这样您就可以看到何时/什么程序集加载并显式设置加载位置。

您可以使用记录程序集加载的Fuslogvw.exe应用程序,并提供有关加载错误的详细信息。

在这里阅读更多内容: http : //msdn.microsoft.com/en-us/library/e74a18c4.aspx

Kentico CMS和您的应用程序是否在同一个应用程序池中定义? 尝试在自己的应用程序池中运行应用程序。

可能发生的情况是,当工作进程被回收时,有时您的应用程序是第一个被添加的,有时Kentico CMS是第一个被添加的,这改变了ICSharpCode.SharpZipLib的解析方式。

如果你偶然刷新一次或两次,你的应用程序首先被加载,这意味着它可以工作。

IIS和Asp.Net中的应用程序池是什么?

更新:您的应用程序是网站(在第一次访问时编译),还是Web项目(在Visual Studio中预编译)。 如果它是一个网站,那么你可以转换为Web项目并尝试吗?