System。*引入NETStandard.Library依赖时引用的麻烦
在一个包含52个项目(所有net462)的大型解决方案中,我们的一些依赖项的最新版本现在仅为.NET标准构建。 因此,它们依赖于NuGet包NETStandard.Library
,而这反过来又拖累了很多其他4.3.x版本的System.*
包,它们通常位于.NET Framework本身。
因此,一些项目引用packages文件夹中的System.*
库,而其他项目引用.NET Framework中的System.*
库。
这导致众所周知的运行时问题,fe:
消息:System.IO.FileLoadException:无法加载文件或程序集’System.Net.Http,Version = 4.1.1.2,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a’或其依赖项之一。 定位的程序集的清单定义与程序集引用不匹配。 (HRESULTexception:0x80131040)
深入研究NETStandard.Library
包的依赖关系,我们可以看到这些包中也存在同样的问题:
- System.Collections中。*
- System.ComponentModel。*
- System.Console
- System.Globalization。*
- System.IO。*
- System.Linq的。*
- System.Net。*
- System.ObjectModel
- 的System.Reflection。*
- System.Resources.ResourceManager
- System.Runtime。*
- System.Text。*
- 的System.Threading。*
- 的System.Xml。*
通常这可以通过在其他项目中安装相同的软件包来解决,但我们在这里处理了很多项目和很多软件包,我不想盲目地将所有这些依赖项添加到所有52个项目中。
这让我想知道是否有人知道从这种情况中恢复的简单方法,并使所有项目从NuGet包文件夹引用正确的包/ DLL,如果它们当前使用.NET Framework内部的那个。
可以在此处找到针对net462和net471的简单VS解决方案来演示此问题
在默认项目模板中, System.Net.Http
作为参考添加到项目中,而不是作为nuget包。
在您的两个解决方案(4.6.1和4.7.1)中:
-
Project
ClassLibrary
将System.Net.Http
作为nuget包依赖。 -
Project
ConsoleApp1
依赖于System.Net.Http
作为.NET Framework的简单参考
因此,该问题与Target Framework版本无关。
要解决此问题,请将相同版本的
System.Net.Http
作为nuget包添加到所有项目(使用它)。
-
在解决方案资源
Manage NuGet Packages for Solution...
器中右键单击解决方案,然后选择Manage NuGet Packages for Solution...
-
切换到
Installed
选项卡 -
在列表中找到
System.Net.Http
,选择它。 -
检查当前状态:
-
将相同版本的软件包(在您的情况下为4.3.0)安装到
ConsoleApp1
项目。 -
检查结果:
- 重建解决方案。
完成。
此外,最好在您的解决方案中整合软件包版本。 相反,您可能会在构建期间出现版本冲突。 或者,更糟糕的是,运行时错误,如MethodNotFound
因为绑定重定向到另一个版本的依赖项。
System.Net.Http
问题的原因在这里描述: 破碎的System.Net.Http 4.1.1-4.3.0验尸部分如何防止将来出现这种情况? 2.1
结果我们确定了2个有问题的OOB包,它们不是平台本身的叶节点,并且依赖于它们的平台–System.Net.Http和System.IO.Compression。
这意味着相同的System.Net.Http
库在.NET Framework中附带,并作为OOB(带外)nuget包。 一些nuget包可以引用它的nuget版本。 这就是我在一开始就描述的问题。
因此,您不必修复对所有System.*
库的引用。 仅适用于以下两种: System.Net.Http
和System.IO.Compression
。