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 ClassLibrarySystem.Net.Http作为nuget包依赖。

  • Project ConsoleApp1依赖于System.Net.Http作为.NET Framework的简单参考

因此,该问题与Target Framework版本无关。

要解决此问题,请将相同版本的System.Net.Http作为nuget包添加到所有项目(使用它)。

  1. 在解决方案资源Manage NuGet Packages for Solution...器中右键单击解决方案,然后选择Manage NuGet Packages for Solution...

  2. 切换到Installed选项卡

  3. 在列表中找到System.Net.Http ,选择它。

  4. 检查当前状态:

System.Net.Http nuget包的引用的初始状态

  1. 相同版本的软件包(在您的情况下为4.3.0)安装到ConsoleApp1项目。

  2. 检查结果:

修复了对System.Net.Http nuget包的引用的状态

  1. 重建解决方案。

完成。


此外,最好在您的解决方案中整合软件包版本。 相反,您可能会在构建期间出现版本冲突。 或者,更糟糕的是,运行时错误,如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.HttpSystem.IO.Compression