问题描述:
共享库"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 ver 4.1.1.0引用System.Diagnostics.DiagnosticSource v.4.0.0.0

- System.Diagnostics.DiagnosticSource v.4.0.0.0与v下载的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>
Run Code Online (Sandbox Code Playgroud)
- 将System.Diagnostics.DiagnosticSource.dll强制转换为版本4.0.0.0:将对System.Diagnostics.DiagnosticSource v.4.0.0.0的NuGet引用添加到引用System.Net.Http的项目中,以抢占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?
- 我们应该继续上面提到的2种解决方法吗?
- 哪一个更好?
- 或者:这个问题有另一个解决方案吗?
- 或者:NuGet包是否有即时更新来修复不一致性?
谢谢.