问题描述:
共享库“shared.dll”项目引用 System.Net.Http NuGet 包 4.3.0。引用“shared.dll”的应用程序失败
System.IO.FileLoadException
无法加载文件或程序集“System.Diagnostics.DiagnosticSource,Version=4.0.0.0,Culture=neutral,PublicKeyToken=cc7b13ffcd2ddd51”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。(来自 HRESULT 的异常:0x80131040)
在 System.Net.Http.WinHttpHandler.SendAsync(...)
在调查了这个问题后,我们得出了导致上述故障的以下原因:
- System.Net.Http v 4.3.0的包信息页面声明了对System.Diagnostics.DiagnosticSource v 4.3.0或更高版本的依赖。从项目中引用 System.Net.Http v 4.3.0 时会自动下载此包。
- System.Net.Http v 4.3.0 的 NuGet 包实际上包括 System.Net.Http.dll v 4.1.1.0(截至 2017 年 1 月 8 日)。
- System.Diagnostics.DiagnosticSource v 4.3.0 的 NuGet 包实际上包括 System.Diagnostics.DiagnosticSource v 4.0.1.0(截至 2017 年 1 月 8 日)。
- System.Net.Http 版本 4.1.1.0 参考 System.Diagnostics.DiagnosticSource v. 4.0.0.0
- System.Diagnostics.DiagnosticSource v. 4.0.0.0 与下载的 dll v 4.0.1.0 不完全匹配。
- 当强命名库引用的版本不完全匹配时,.NET 运行时仍会尝试查找引用的程序集。如果不能:生成库加载异常。另请参阅以下备注
有几种解决方法:
- app.config 选项:声明兼容版本(我们应该走多远?)在 app.config 中为任何“shared.dll” - 引用应用程序绑定重定向。
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" /> </dependentAssembly> </assemblyBinding>
- 强制 System.Diagnostics.DiagnosticSource.dll 到版本 4.0.0.0:向引用 System.Net.Http 的项目添加对 System.Diagnostics.DiagnosticSource v. 4.0.0.0 的 NuGet 引用,以抢占 dll 版本 4.0.1.0 的自动下载。此选项失去了自动更新 NuGet 依赖项的能力,但使应用程序的部署无需配置。
尽管正确的问题解决方案在于解决包所有者的上述 NuGet 包不一致问题,但有一种烦人的感觉。当在源处修复时,不需要 System.Net.Http 包消耗代码的解决方法。
问题:
- 为什么 System.Net.Http v 4.3.0 包包含不匹配的 System.Net.Http.dll v 4.1.1 而有更早的确切版本包 4.1.1?
- 我们是否应该继续使用上述两种解决方法中的任何一种?
- 哪一个更好?
- 或者:这个问题有其他解决方案吗?
- 或者:NuGet 包是否有即将更新以修复不一致的问题?
谢谢。