我正在将 Net Framework 4 dll 移植到 Net Core。 当移植我的单元测试项目时,我在运行一些特定测试(不是全部)时遇到异常。
System.IO.FileLoadException:无法加载文件或程序集“System.Net.Http,Version=4.1.1.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。找到的程序集的清单定义与程序集引用不匹配。 (HRESULT 异常:0x80131040)
这是我的 dll 的project.json
{
"version": "1.0.0-*",
"dependencies": {
"log4net": "2.0.7",
"NETStandard.Library": "1.6.1",
"Newtonsoft.Json": "9.0.1",
"StackExchange.Redis": "1.2.1"
},
"frameworks": {
"netstandard1.6": {
"imports": "dnxcore50"
}
}
}
这是单元测试项目的 Packages.config
<packages>
<package id="Castle.Core" version="4.0.0" targetFramework="net462" />
<package id="log4net" version="2.0.7" targetFramework="net462" />
<package id="Microsoft.Win32.Primitives" version="4.0.1" targetFramework="net462" />
<package id="Moq" version="4.7.1" targetFramework="net462" />
<package id="Newtonsoft.Json" version="9.0.1" targetFramework="net462" />
<package id="StackExchange.Redis" version="1.2.1" targetFramework="net462" />
<package id="System.Diagnostics.DiagnosticSource" version="4.0.0" targetFramework="net462" />
<package id="System.IO" version="4.1.0" targetFramework="net462" />
<package id="System.IO.FileSystem" version="4.0.1" targetFramework="net462" />
<package id="System.IO.FileSystem.Primitives" version="4.0.1" targetFramework="net462" />
<package id="System.IO.FileSystem.Watcher" version="4.0.0" targetFramework="net462" />
<package id="System.Linq" version="4.1.0" targetFramework="net462" />
<package id="System.Net.Http" version="4.1.1" targetFramework="net462" />
<package id="System.Net.NameResolution" version="4.0.0" targetFramework="net462" />
<package id="System.Runtime" version="4.1.0" targetFramework="net462" />
<package id="System.Runtime.Extensions" version="4.1.0" targetFramework="net462" />
<package id="System.Security.Cryptography.Algorithms" version="4.2.0" targetFramework="net462" />
<package id="System.Security.Cryptography.Encoding" version="4.0.0" targetFramework="net462" />
<package id="System.Security.Cryptography.Primitives" version="4.0.0" targetFramework="net462" />
<package id="System.Security.Cryptography.X509Certificates" version="4.1.0" targetFramework="net462" />
<package id="System.Text.RegularExpressions" version="4.1.0" targetFramework="net462" />
<package id="System.Threading.Thread" version="4.0.0" targetFramework="net462" />
</packages>
通过将 System.Net.Http 更新到 4.3.1 来修复它
我遇到了这个问题,并意识到这是因为我有两个不同的参考资料。 第一个引用来自我的项目库,第二个引用是 .Net 标准库的依赖项,因此是 Nuget 包。 解决步骤如下:
System.Net.Http
的引用(项目 => 添加引用 => 删除引用)。Update-Package –reinstall System.Net.Http
以恢复参考。现在又可以用了。 :)
转到 app.config 并删除所有引用 System.Net.Http 的行。
例如如果有类似的内容请删除
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.1.1.2" />
</dependentAssembly>
我的问题是我的服务有一个引用的程序集,该程序集引用了较新版本的 System.Net.Http。 我已通过更新服务中的 System.Net.Http 解决了该问题。
解决此问题的最佳且最简单的方法是使用绑定重定向。
只需指定旧版本为 0.0.0.0-5.0.0.0,新版本为 4.1.1.0
例如,4.1.1.0 是您的版本。
我在 .NET Framework 4.8 项目中引用 System.Net.Http 版本 4.2.0.0 时遇到了同样的问题。
仔细阅读异常信息,我注意到有一个名为“FusionLog”的条目。
它指出我的 App.config 文件中 System.Http.Net 的绑定存在版本重定向。
在 App.config 中我发现了一个 XML 部分,例如:
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
删除整个 assemblyBinding 部分就可以了。
我遇到了这个问题,而我有 10 个相互依赖的项目。 我通过在依赖的项目之一中添加它要求的版本来解决这个问题。 编译不需要它,但似乎添加它,在恢复时修复了其他项目中的版本。 原来如此:
无法加载文件或程序集“System.Net.Http,版本=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其之一 依赖关系。系统找不到指定的文件。
然后:
无法加载文件或程序集“System.Net.Http,版本=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其之一 依赖关系。系统找不到指定的文件。
所以我添加了 "System.Net.Http": "4.1.1", 在一个项目中..
这实际上解决了问题,同时恢复了 8 个项目。
现在是初级程序员解决方案......仔细检查您是否也在 Nuget 包管理器中的正确位置进行了 Jawen 和 Jean 建议的更新。 请记住,您的项目和测试项目可能有一个解决方案,因此请仔细检查以更新两组参考资料。
这个问题真让我抓狂!自首次报道以来已有多年,但似乎从未成功。我最近在 Visual Studio 2022 中开发解决方案时遇到了这个障碍。
好消息是,Githut 线程中提到的解决方法确实有效。有关更多背景信息,这是一个很好的起点:[“无法加载 System.Net.Http,Version=4.x.y.z”][1]
解决方案非常简单,您所需要做的就是添加绑定重定向。 一些注意事项:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" culture="neutral" publicKeyToken="b03f5f7f11d50a3a" />
<bindingRedirect oldVersion="0.0.0.0-4.6.26011.1" newVersion="4.2.0.0" />
</dependentAssembly>
</runtime>
</configuration>
<RestoreProjectStyle>PackageReference</RestoreProjectStyle>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>