为什么我不能在引用了System.Net.Http的解决方案中使用System.Net.Http包?

10

使用VS2017,我已经在一个空解决方案中创建了一个(.NET Framework 4.6.2)。然后我在那里安装了System.Net.Http 4.3.2包,并在Class1的构造函数中使用了HttpClient类。

接下来我创建了一个ConsoleApp(.NET Framework 4.6.2),引用了ClassLibrary并在Main方法中实例化了Class1

现在运行ConsoleApp会导致运行时异常:

未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集'System.Net.Http,Version=4.1.1.1,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a'或其其中之一的依赖项。系统找不到指定的文件。 ClassLibrary1.Class1..ctor() at ConsoleApp1.Program.Main(String[] args) in [...]

在详细的构建日志中,我看到了这个消息:

假设我无法从 ConsoleApp 中删除对 System.Net.Http 的引用,因为我在一个真实的项目结构中遇到了这种情况。

2> "System.Net.Http,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"和 "System.Net.Http,Version = 4.1.1.1,Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a"之间存在冲突。

2> 选择了“System.Net.Http,Version = 4.0.0.0,Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a”,因为它是主要的, 而“System.Net.Http,Version = 4.1.1.1,Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a”不是。

  • 尝试使用System.Net.Http参考的Specific Version参数未能解决问题。
  • 指定<bindingRedirect oldVersion="0.0.0.0-4.1.1.1" newVersion="4.1.1.1" />未能解决问题。

我已经在谷歌上搜索了这个问题,发现它是一个常见的问题,但是我没有找到一个清晰的解释来说明实际发生了什么以及如何一般性地解决这种情况。

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

无法加载文件或程序集“System.Net.Http”或其某一个依赖项

关于冲突:

当选择冲突的dll引用时,.NET中的“primary”是什么意思?

发现了无法解决的相同依赖程序集不同版本之间的冲突错误。


因为基本上,微软搞砸了:https://github.com/dotnet/corefx/issues/11100 - Gaute Løken
真的吗?我不明白发生了什么事,你能在回答中解释一下吗? - astef
5
他们为 .net core 的 System.Net.Http 添加了一些功能。当从框架 4.6.1/4.6.2 应用程序 (通过 .NET Standard) 进行目标设置时,由于添加的安全要求导致了回归,这破坏了框架应用程序中的某些内容。但是,他们无法通过将重定向添加到旧版本来恢复,因为那样可能会破坏使用这些新功能的应用程序。因此,开发人员需要维护重定向,但 NuGet 将覆盖它们。是的,这很混乱。:( - Gaute Løken
1
好消息是,如果你将重定向目标更改为4.0.0.0,很有可能它会起作用。 - Gaute Løken
http://wiki.c2.com?HoursOfFun - mortb
这个回答解决了你的问题吗?在System.Net.Http中发现冲突 - Michael Freidgeim
2个回答

2
我想知道为什么您选择使用NuGet包而不是使用引用管理器来加载适当的程序集。在很多项目模板中,VS默认包含System.Net.Http。如果您使用NuGet包浏览器安装程序集,则以下两个选项之一应该会有所帮助:
  1. 删除NuGet包并使用引用管理器中分配的版本(查看“程序集/框架”下的内容),尽管我打赌这已经被选中了。
  2. 在引用管理器中取消选择分配的System.Net.Http版本,并使用您使用NuGet安装的版本。
就个人而言,除非您绝对需要NuGet最新版本中的某些特定功能,否则我认为选项1更好。

1
在一个真实的项目中,由于间接依赖关系,我被迫将 System.Net.Http nuget 包安装到我的一个项目中(这导致运行时出现了一切失败,非常好)。在所有其他项目中从引用迁移到此包有点痛苦,我想避免这种情况。 - astef
那么你的问题就在这里,你有两个冲突的东西,解决冲突的唯一方法是删除你不需要的那一个。 - Kodaloid
这真令人沮丧。该怪谁呢? - astef

1

解决这个问题的最佳和最简单的方法是使用绑定重定向,正如所说的那样。但版本控制似乎有些问题。

只需将oldVersion指定为0.0.0.0-5.0.0.0,newVersion指定为4.1.1.0即可。

其中4.1.1.0是您的版本,例如。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接