使用VS2017,我在一个空的解决方案中创建了一个 ClassLibrary (.NET Framework 4.6.2) . 然后我在那里安装了System.Net.Http 4.3.2包并在 Class1
构造函数中使用了 HttpClient
类 .
然后我创建了 ConsoleApp (.NET Framework 4.6.2),在 Main
方法中引用了 ClassLibrary 并实例化了 Class1
.
现在运行 ConsoleApp 会导致运行时异常:
未处理的异常:System.IO.FileNotFoundException:无法加载文件或程序集'System.Net.Http,Version = 4.1.1.1,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一 . 该系统找不到指定的文件 . 在[...]中的ConsoleApp1.Program.Main(String [] args)的ClassLibrary1.Class1..ctor()中
在详细的构建日志中,我看到以下消息:
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 “ 不是 .
假设我无法从 ConsoleApp 删除对 System.Net.Http
的引用,因为我在实际项目结构中有这种情况 .
-
使用
System.Net.Http
参数System.Net.Http
参考没有帮助 . -
指定
<bindingRedirect oldVersion="0.0.0.0-4.1.1.1" newVersion="4.1.1.1" />
没有帮助
我用谷歌搜索了它,这是一个受欢迎的问题,但我没有找到实际发生的事情以及如何解决这类案件的明确解释 .
Could not load file or assembly System.Net.Http version 4.1.1.0
Could not load file or assembly 'System.Net.Http' or one of its dependencies
关于冲突:
What does .NET mean by 'primary' when choosing between conflict dll reference?
2 回答
我想知道你为什么选择使用NuGet包而不是使用Reference Manager加载适当的程序集 . 默认情况下,很多项目模板VS都包含System.Net.Http . 如果您使用NuGet包资源管理器来安装程序集,那么这两个选项之一应该有所帮助:
删除NuGet包并使用Reference Manager中指定的版本(在Assemblies / Framework下查看),虽然我打赌这已经被选中了 .
在Reference Manager中取消选择已分配的System.Net.Http版本,并使用随NuGet一起安装的版本 .
就个人而言,我认为选项1更好,除非您绝对需要仅在NuGet最新版本中找到的特定内容 .
解决此问题的最佳和最简单的方法是使用绑定重定向,如上所述 . 但版本控制看起来很糟糕 .
只需将oldVersion指定为0.0.0.0-5.0.0.0,将newVersion指定为4.1.1.0
例如,4.1.1.0是您的版本 .