【问题标题】:Found conflicts between System.Net.Http发现 System.Net.Http 之间存在冲突
【发布时间】:2018-07-29 16:52:25
【问题描述】:

我的 VS 解决方案中有几个项目。每当我将“System.Net.Http”NuGet 包添加到其中一个时,它都会显示为版本 4.2.0.0。然后我做同样的事情并添加相同的 NuGet 包,但是,另一个说版本。 4.1.1.2

然后我收到警告:

发现 System.Net.Http 之间存在冲突

编辑1:

Gathering dependency information took 1.7 sec
Attempting to resolve dependencies for package 'System.Net.Http.4.3.3' with DependencyBehavior 'Lowest'
Resolving dependency information took 0 ms
Resolving actions to install package 'System.Net.Http.4.3.3'
Resolved actions to install package 'System.Net.Http.4.3.3'
Retrieving package 'System.Net.Http 4.3.3' from 'nuget.org'.
Adding package 'System.Net.Http.4.3.3' to folder 'C:\...Service\packages'
Added package 'System.Net.Http.4.3.3' to folder 'C:\...Service\packages'
Added package 'System.Net.Http.4.3.3' to 'packages.config'
Successfully installed 'System.Net.Http 4.3.3' to ....Service
Executing nuget actions took 2.05 sec
Time Elapsed: 00:00:03.8937113

请注意安装了正确的版本,但是 => 道具 => 版本说 4.1.1.2

【问题讨论】:

  • 项目是否针对完全相同的框架版本?
  • 是的。都是4.6.1
  • 您是否有可能在 Nuget 为其拉取该版本的项目中有依赖于 4.1.1.2 的内容?在最坏的情况下,您可以使用-Version 命令行选项在另一个项目中安装 4.1.1.2
  • 我卸载了所有 nuget 包,从其他项目中删除了所有引用。然后再次添加 System.Net.Http NuGet。还是说 4.1.1.2。
  • 我注意到当您创建一个新的服务结构有状态项目时会发生这种情况。目标框架说 4.6.1。当您将“System.net.http”NuGet 添加到该项目时,它将引用 .net.http 版本 4.1.1.2。但是,当您添加新的类库时,针对相同的 .net 框架 (4.6.1) 并执行添加相同 NuGet 包 (System.Net.Http) 的相同步骤。它将参考版本 4.2.0.0。不知道如何解决这个问题

标签: c# .net nuget service-fabric-stateful


【解决方案1】:

您可以强制安装您正在安装的版本,这样您就可以使两个项目对齐,或者在输出窗口中找到一条消息,告诉您哪里出了问题或您的依赖项是什么。 由于official link 没有列出 4.2 版本,我会这样做(解决方案范围)

Install-Package System.Net.Http -Version 4.1.1

或者对于两个项目

Get-Project ProjectName | Install-Package System.Net.Http -Version 4.1.1

或者,甚至更好(使用最新版本)

Install-Package System.Net.Http -Version 4.3.3

编辑

Apparently you are not the first to experience this。 答案here怎么样? 基本上你可以对齐 both 项目配置文件的这一部分:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" />
        <bindingRedirect oldVersion="0.0.0.0-4.1.1.2" newVersion="4.2.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

您可能需要调整令牌值。 以防万一,你能粘贴两个项目的配置文件吗=

【讨论】:

  • 还是不行。即使指定版本号
  • 能否请您粘贴输出和包管理器控制台输出,包括上面的那些命令?谢谢。
  • 请参阅Edit1。运行这个命令:Install-Package System.Net.Http -Version 4.3.3
  • 问题仍然存在,但是,将此添加到已安装 Service Fabric 项目(版本 4.1.1.2)的 app.config - 警告不再显示:
  • 好吧。仍然不确定为什么 Service Fabric 项目将始终强制安装版本 4.1.1.2 而不是最新版本。
【解决方案2】:

当您引用框架 System.Net.Http,但您的包引用之一需要 NuGet 包 System.Net.Http 时,往往会发生这种情况。

查看您是否有对该程序集的引用,将其删除并安装 NuGet 包

【讨论】:

  • 我怎么知道是哪一个?
  • 运行上面的卸载命令后,还有System.Net.Http的引用吗?
  • 这个答案解决了我使用 System.Net.Http 的问题。我有框架引用(4.0.0.0)和包引用(4.1.1.2)的真正组合。另请注意,包管理器可能仍会安装显示为“4.3.3”(2018 年 9 月)的版本,但在程序集中,版本号为 4.1.1.2。后一个数字必须在 Web/App 配置中使用
【解决方案3】:

编辑:这仅在使用 .NET Framework 时发生。在 .NET Core/Standard 领域,最新的 System.Net.Http 程序集版本似乎总是 4.1.2.0 - 没有可用的 4.2.0.0 版本。

关于 System.Net.Http 的问题是方式,方式比这里的答案似乎暗示的更复杂......

  1. 是的,有一个System.Net.Http NuGet 包,但是不,它不会安装同一程序集的最新版本(它包含 System.Net.Http 程序集的 4.1.1.2 版本,而不是4.2.0.0)。
  2. 最新的 Microsoft Visual Studio(或 Microsoft Visual Studio 构建工具)提供版本 4.2.0.0,但这意味着您的 .csproj 将始终使用它...
  3. 出于某种原因(我还不能理解),使用 4.2.0.0 的唯一保证方法是引用某些使用它的 NuGet 包,例如我们 System.Buffers(4.5.0 版适用于我) .

TL;DR:

如果您想确保项目使用的是System.Net.Http 4.2.0.0 程序集,请将System.Buffers 4.5.0+ NuGet 引用添加到您的项目中。

参考资料:

【讨论】:

  • 这解决了我的问题。我将 .NET 框架和 aspnetcore 项目混合在一起运行。
  • 这也为我解决了这个问题。天哪,微软 .net 核心团队,这真是一团糟。我花了将近 2 天的时间在一个引入 .net 标准库的大型项目上尝试解决这个问题。
  • 我已经添加了an answer,这是我根据在此答案中找到的信息以及不需要添加随机参考(如System.Buffers)的引用参考。它比较冗长,但希望它会有所帮助。
  • 真正令人沮丧的问题是一个非常非常规的解决方法,但我感谢您解决这个问题并分享它。这解决了我的问题。
  • 这是一个疯狂的答案,我喜欢它。
【解决方案4】:

在浏览了这里提供的所有解决方案和this answer 中引用的参考资料后,我终于完全解决了这个问题。这是我认为遇到此问题的任何人都应该做的:

  1. 将所有 NuGet 包更新到最新版本。
  2. 按照说明 here 将 NuGet 从 packages.config 迁移到 PackageReference。基本上,对于解决方案中的每个项目,在解决方案资源管理器中,右键单击 References 节点或 packages.config 文件并选择 Migrate packages.config to包参考...。 ASP.NET 网站项目必须继续使用 packages.config
  3. 删除对System.Net.Http 的任何不由 NuGet 管理的引用(对于使用 PackageReference 的项目,您应该在解决方案资源管理器中的引用旁边看到 NuGet 符号 )。如果您确定您的项目需要System.Net.Http,则将删除的System.Net.Http 引用替换为相应的NuGet 包(请先尝试在没有它的情况下进行构建)。对于使用 packages.config 的项目,请特别注意确保需要对 System.Net.Http 的引用并且它们也使用 NuGet。无论如何,它可能有助于通过 NuGet 删除和重新添加 System.Net.Http(对于引用它的 所有 项目),即使已经使用 NuGet 引用。我发现第 2 步可能会在某处造成一些脱节。
  4. 升级到 .NET Framework 4.7.2,原因描述为 here。这是 VS 2019 的一部分。否则,请从 here 下载它或使用适用于 VS 2017 的 Visual Studio 安装程序。
  5. 从所有 app.configWeb.config 文件中删除 all 程序集绑定,然后构建您的解决方案。 app.config 绑定不再需要。 Web.config 绑定将在下一步中重新添加,但首先删除它们可确保您的绑定中没有任何过时的版本。
  6. 您现在可能会在此阶段遇到一些其他冲突。对于您的 ASP.NET 网站项目,将绑定重定向添加到警告中提供给您的 Web.config。对于其他 .NET Framework 应用程序,对于您收到警告的引用,在您收到警告的项目中添加相应的 NuGet 包,即使项目在没有添加引用的情况下编译也是如此。这会强制项目使用 NuGet 版本,而不是可能被另一个包引用的本地 .NET Framework 版本。这是由于 rsenna 的 aforementioned answer 提到的 .NET Framework 和 .NET Standard 之间的交叉。构建后,您可能需要重复此步骤以获取更多参考。

如果您后来发现在某处添加引用后由于清单不匹配而导致运行时异常(即使在单元测试期间),请从相关网站项目中删除所有绑定重定向,然后重新添加中给出的建议按照第 6 步的警告。

我花了很多时间试图有条不紊地解决这个问题,所以我相信上述步骤将完全解决大多数人的问题,尽管对于不寻常的情况可能需要一些横向思考。让我知道这对您是否有效(或无效)。

【讨论】:

  • answer you mentioned 似乎表明,为了避免(大多数?全部?)绑定重定向,我们需要升级到 .NET Framework 4.7.2。我发现这很有说服力,所以+1。但不幸的是,目前我无法将我们的环境升级到 4.7.2,这使得 System.Buffers 解决方案即使有点“随机”,仍然是最好的解决方案,至少在我的情况下,至少现在是这样。
  • @rsenna 是的,将环境升级到 4.7.2 的要求对我们来说也是一个症结所在,但这只是像往常一样开始流程并消除繁文缛节的问题。我认为这是一个比短期黑客更好的长期解决方案。
  • System.Buffers 解决方案对我不起作用,但这个解决方案对我有用。我建议花时间升级,因为我尝试的解决方法不一致。 90% 的时间他们会工作,但随后他们会失败,我不知道为什么。
  • @JasonlPrice 谢谢。我刚刚在 VS 2019 中的现有 ASP.NET 网站项目上再次遇到问题,并花时间使用此过程升级所有内容,完全修复了它。值得注意的是,专门针对 ASP.NET 网站项目,第 2 步不适用,第 3 步对 packages.config 有具体说明,只要使用 NuGet 和作为常规程序集引用。
  • FWIW:我们在 .NET 4.6.1 上,迁移 packages.config 后,版本不匹配问题得到解决..
【解决方案5】:

自 2018 年 10 月 9 日起,有一个新的解决方案。

  1. 您需要将所有对 System.Net.Http 的引用更新到最新版本 4.3.4。
  2. 您应该将包安装到导致冲突的 .Net 框架解决方案中,即使它没有明确需要该包。
  3. 如果您的项目具有新的项目结构,请对其进行编辑并确保它包含以下包引用:

    <PackageReference Include="System.Net.Http" Version="4.3.4" />
    
  4. 搜索您的解决方案并删除 System.Net.Http 的任何现有绑定重定向,它们将如下所示

    <dependentAssembly>
      <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
    </dependentAssembly>
    
  5. 重新构建,警告现在应该消失了,您的代码应该可以正常构建和运行

【讨论】:

  • 这对我有用,只需对 web.config 文件进行一次编辑(第 4 项)
  • System.Net.Http 4.3.4 版本的程序集版本是 4.1.1.3。至少对于 Nuget 文件夹“System.Net.Http/4.3.4/lib/net46/System.Net.Http.dll'”中的这个dll。
【解决方案6】:

上面 Neo 发布的 6 个步骤帮助我解决了我的 ASP.NET 包问题!谢谢尼奥!我处理这个问题已经一个多星期了。

我只是想分享我在上面实施 Neo 帖子的经验中的个人笔记。

我有一个针对 .Net Framework 4.6.1 的 ASP.NET Web API 项目

这是我所做的:

  • 升级到 .Net Framework 4.7.2
  • 将所有 NuGet 包更新到最新版本。
  • (可选,也可以执行“update-package -reinstall”以确保所有软件包都与 4.7.2 相关联)
  • 整合包
  • 我没有从 packages.config 迁移到 PackageRefence,因为你不能在 ASP.NET 中
  • 从 System.Net.Http 和其他需要它的引用中删除了引用,并将它们添加为 NuGet 包。
  • 从 web.config 和 app.config 中删除了所有程序集绑定(在 .Core、.Tests、.IntegrationTests 库中)
  • 为我们的内部 NuGet 包添加了绑定重定向,这些包的版本号以文本 (n.n.n.n-beta) 结尾,但删除了文本并且只有数字 (n.n.n.n)
  • 将此添加到所有 .csproj 文件中:
属性组>
  • 确保所有 packages.config 文件中的包在解决方案中的所有项目中具有相同的版本
    • 确保 web.config 中的版本相同
    • 确保 .csproj 文件中的版本相同(如果适用)
  • 使用 Microsoft.Net.Compilers 3.1.1(更新解决方案中的所有 .csproj 文件,包括 .Tests 和 .IntegrationTests)
  • 对于使用 Redis 的数据保护 API (DPAPI):
    • 安装 Microsoft.AspNetCore.DataProtection.StackExchangeRedis 2.2.5
    • StackExchange.Redis 2.0.601
    • 将 System.Numerics.Vectors 更新到 4.4.0(注意:4.5.0 中有一个错误会阻止服务器连接)

【讨论】:

    【解决方案7】:

    在使用 Azure Worker 角色时,我已经两次遇到此问题。对 system.net.http 的任何调用都会导致代码挂起,但 Azure 根本没有任何反馈,因此需要数小时或数天的时间注释掉代码才能找到原因,更不用说解决方案了。

    一个简单的技巧为我解决了这个问题。这不是我的解决方案,大约 6 个月前我遇到过,但是当今天问题再次发生在我身上时,我认为值得发布。

    1. 从您的项目中删除对 System.Net.Http 的所有引用
    2. 转到“C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib”
    3. 创建一个新目录,例如“temphide”
    4. 将所有 System.Net.* DLL 移动到此目录中
    5. 现在,当您部署时,您的项目将使用 Nuget 版本,不再有冲突

    【讨论】:

      【解决方案8】:

      我正在使用 .NET 4.6.2 并发现了同样的问题。我有两个项目一个网站和一个测试项目。我审查以下内容:

      • 两个项目都安装了 System.Net.Http 的 NuGet 包

      • 两个程序中的引用是相等的并且都指向同一个

      问题。项目中的Web.Config和App.Config指向不同的System.NET.Http。

      我将两个配置中的代码替换为:

      <dependentAssembly>
          <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
          <bindingRedirect oldVersion="0.0.0.0-4.1.1.3" newVersion="4.1.1.3" />
        </dependentAssembly>
      

      在他们两个中。然后冲突就消失了。

      【讨论】:

      • .config 文件更改已在两年前的this answer 底部进行了描述。
      【解决方案9】:

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

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

      【讨论】:

        【解决方案10】:

        只需从不同的项目/类库中删除 system.net.http 引用,然后再次添加该引用。

        【讨论】:

          猜你喜欢
          • 2018-07-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-24
          • 1970-01-01
          • 1970-01-01
          • 2018-02-25
          • 2014-01-25
          相关资源
          最近更新 更多