共享库“shared.dll”项目引用System.Net.Http NuGet包4.3.0。引用Application “shared.dll” 失败,
System.IO.FileLoadException
无法加载文件或程序集“System.Diagnostics.DiagnosticSource,版本= 4.0.0.0,文化=中性公钥= 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诉4.0.0.0
- System.Diagnostics.DiagnosticSource诉4.0.0.0是不完全匹配到v下载DLL V4.0起.1.0。
- 当强命名库引用的版本不完全匹配时,.NET运行时仍会尝试查找引用的程序集。如果不能:将生成库加载异常。还可以看到以下remark
有几个解决方法:
- 的app.config选项:在app.config中声明兼容的版本(我们应该走多远有吗?)有binding redirection用于任何 “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版本: 添加的NuGet参照System.Diagnostics.DiagnosticSource V4.0起。 0.0到项目引用System.Net.Http抢先自动下载dll版本4.0.1.0。该选项失去了自动更新NuGet依赖项的能力,但使应用程序无配置部署。
- 为什么System.Net.Http v 4.3.0包中包含的不匹配System.Net.Http.dll v 4.1.1虽然早确切版本4.1.1包?
- 我们应该继续上面提到的两种解决方法吗?
- 哪一个更好?
- 或者:是否有另一种解决方案?
- 或者:是否有对NuGet包进行即时更新以修复不一致?
虽然正确的问题解决方案在于修复上述NuGet软件包不一致的问题,但仍有一种唠叨的感觉。在源中修复时,System.Net没有解决方法。需要使用Http包的代码。
问题:
谢谢。
我尝试在.NET Framework 4.6项目上安装'System.Net.Http' 4.3.0,并且绑定重定向是自动生成的。尝试在[dotnet/corefx](https://github.com/dotnet/corefx/issues/new)GitHub问题跟踪器上询问此问题以获取更多详细信息。 –
谢谢,我将通过GitHub询问。我曾尝试删除并重新添加引用(VS 20015),并且app.config保持不变(无绑定重定向)。请注意,我们的解决方案比单一装配解决方案更复杂。它包含多个可执行文件和共享库程序集。 –
@Joel Verhagen:在https://github.com/dotnet/corefx/issues/15031 –