无法加载文件或程序集 System.Net.Http 版本 4.1.1.0

Could not load file or assembly System.Net.Http version 4.1.1.0

我正在将 Net Framework 4 dll 移植到 Net Core。 移植我的单元测试项目时出现异常 运行 一些特定测试(不是全部)。

System.IO.FileLoadException: Could not load file or assembly 'System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

这是我的 dllproject.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

修复了它

我有这个问题,而我有 10 个项目相互依赖。 我通过在依赖的项目之一中添加它要求的版本来解决这个问题。 编译不需要它,但似乎添加它,在恢复时修复了其他项目中的版本。 所以它是:

Could not load file or assembly 'System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

然后:

Could not load file or assembly 'System.Net.Http, Version=4.1.1.1, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

所以我加了 "System.Net.Http": "4.1.1", 在一个项目中..

这实际上解决了问题,同时恢复了 8 个项目。

我的问题是我的服务有一个引用程序集,该程序集引用了更新版本的 System.Net.Http。 我已经通过更新服务中的 System.Net.Http 解决了这个问题。

我发现了问题,并意识到这是因为我有两个不同的引用。 一个引用来自我的项目库,第二个引用是 .Net Standard 库的依赖项,因此是一个 Nuget 包。 解决步骤如下:

  • 删除对 System.Net.Http 的引用(项目 => 添加引用 => 删除引用)。
  • 保留 System.Net 和 System.Net.Http Nuget 包
  • 运行 Update-Package –reinstall System.Net.Http 带回参考。

现在又可以用了。 :)

解决此问题的最好和最简单的方法是使用绑定重定向。

只需指定oldVersion为0.0.0.0-5.0.0.0,newVersion为4.1.1.0

例如,4.1.1.0 是您的版本。

现在是初级程序员解决方案....仔细检查您是否也在正确的位置进行了 Jawen 和 Jean 在 Nuget 包管理器中建议的更新。请记住,您的项目和测试项目可能都有一个解决方案,因此请仔细检查以更新两组参考资料。

转到 app.config 并删除那里引用 System.Net.Http 的所有行。

我尝试了各种解决方案(删除 dependentAssembly 或指定绑定重定向)。 None 他们工作了。

但是,唯一对我有用的解决方案是将 System.Net.Http 的特定版本(或任何给您版本问题的 DLL)从 Visual Studio.

显式设置为 False

我在 .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 部分就可以了。

这个问题真让我抓狂!自首次报道以来已有多年,但似乎从未成功过。我最近在 Visual Studio 2022 年研究解决方案时遇到了这个问题。

好消息是,Githut 线程中提到的解决方法确实有效。有关更多背景信息,这是一个很好的起点:["Could not load System.Net.Http, Version=4.x.y.z"][1]

解决方案非常简单,您需要做的就是添加绑定重定向。 一些注意事项:

  • 确保你在所有地方添加绑定重定向这个 nuget 被引用
  • 使用最低汇编版本,而不是最高版本。这很愚蠢,但是当我像往常一样尝试使用最高版本时,我仍然遇到了这个问题
    <?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>
    
    [1]: https://github.com/dotnet/standard/issues/891