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

Sha*_*eKm 22 .net c# nuget service-fabric-stateful

我的VS解决方案中有几个项目.每当我将"System.Net.Http"NuGet包添加到它显示为4.2.0.0版本的包时.然后我也这样做并添加相同的NuGet包,然而,另一个说版本.4.1.1.2

在此输入图像描述 在此输入图像描述

然后我收到警告:

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

EDIT1:

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
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

rse*_*nna 35

编辑:仅在使用.NET Framework时才会发生这种情况.在.NET Core/Standard System.Net.Http版本中,最新的汇编版本似乎总是4.1.2.0 - 没有4.2.0.0版本可用.

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

  1. 是的,有一个System.Net.HttpNuGet包,但不,它不会安装相同程序集的最新版本(它包含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.Buffers如果要确保使用System.Net.Http4.2.0.0程序集,请将4.5.0+ NuGet引用添加到项目中.

参考文献:

  • 这也为我解决了这个问题.神圣的jeebus微软.net核心团队,这是一个烂摊子.我花了将近2天试图在一个引入.net标准库的大型项目上解决这个问题. (6认同)
  • 这解决了我的问题.我将.NET框架和aspnetcore项目混合在一起运行. (3认同)
  • 这是一个如此疯狂的答案,我喜欢它。 (2认同)

Neo*_*Neo 15

在完成了这里提出的所有解决方案和本答案中引用的参考文献后,我终于彻底解决了这个问题.我相信任何遇到此问题的人都应该这样做:

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

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

我花了很多时间试图有条不紊地解决这个问题,所以我相信上面的步骤可以完全解决大多数人的问题,尽管对于不寻常的情况可能需要一些横向思考.如果这对您有用(或不起作用),请告诉我.

  • [你提到的答案](https://github.com/dotnet/corefx/issues/22781#issuecomment-376348344)似乎表明,为了避免(大多数?全部?)绑定重定向,我们需要升级到.NET Framework 4.7.2.我发现这很有说服力,所以+1就是这样.但不幸的是,我现在无法将我们的环境升级到4.7.2,这使得`System.Buffers`解决方案,即使有点"随机",仍然是最好的解决方案,至少在我的情况下,至少现在. (3认同)
  • @rsenna 是的,将环境升级到 4.7.2 的要求对我们来说也是一个症结所在,但这只是像往常一样开始流程并跳过繁文缛节的问题。我认为这是一个比短期黑客更好的长期解决方案。 (2认同)
  • 这对我有用:1-删除了对 System.Net.Http 的 .Net 框架的文件引用 2-将框架更新到 4.7.2,以最大限度地提高 .Net 标准的 api 表面兼容性。3-更新/合并所有 nuget bin 文件夹包含框架中的 System.Net.Http 而不是 nuget 版本,因此它在运行时崩溃。 (2认同)

eri*_*len 9

当你引用框架System.Net.Http时,这往往会发生,但是你的一个包引用需要NuGet包System.Net.Http.

看看你是否有对该程序集的引用,删除它并安装NuGet包


Obi*_*Eff 7

有一个新的解决方案可以在 2018 年 10 月 9 日生效。

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

    <PackageReference Include="System.Net.Http" Version="4.3.4" />
    
    Run Code Online (Sandbox Code Playgroud)
  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>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 重新构建,警告现在应该消失了,您的代码应该可以正常构建并运行

  • 版本 4.3.4 的 System.Net.Http 的程序集版本是 4.1.1.3。至少对于 Nuget 文件夹“System.Net.Http/4.3.4/lib/net46/System.Net.Http.dll'”中的这个 dll 来说。 (2认同)

Fra*_* B. 6

您可以强制安装版本,这样既可以使两个项目对齐,也可以在输出窗口中找到一条消息,提示您出了什么问题或依赖项。由于官方链接未列出任何4.2版本,因此我将这样做(在解决方案范围内)

Install-Package System.Net.Http -Version 4.1.1
Run Code Online (Sandbox Code Playgroud)

或对于两个项目

Get-Project ProjectName | Install-Package System.Net.Http -Version 4.1.1
Run Code Online (Sandbox Code Playgroud)

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

Install-Package System.Net.Http -Version 4.3.3
Run Code Online (Sandbox Code Playgroud)

编辑

显然,您不是第一个体验到这一点的人这里的答案如何?基本上,您可以对齐两个项目配置文件的这一部分:

  <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>
Run Code Online (Sandbox Code Playgroud)

您可能必须调整令牌值。以防万一,您是否可以为两个项目粘贴配置文件=

  • 仍然无法正常工作。即使指定版本号 (2认同)