System.*引入NETStandard.Library依赖时引用的麻烦

huy*_*itw 32 c# nuget visual-studio-2017

在一个包含52个项目(所有net462)的大型解决方案中,我们的一些依赖项的最新版本现在仅针对.NET标准构建.因此,它们依赖于NuGet包NETStandard.Library,而后者又拖入很多其他4.3.x版本的System.*软件包中,这些软件包通常位于.NET Framework本身.

因此,一些项目引用System.*packages文件夹中的System.*库,而其他项目引用.NET Framework中的库.

这导致众所周知的运行时问题,fe:

消息:System.IO.FileLoadException:无法加载文件或程序集'System.Net.Http,Version = 4.1.1.2,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常: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解决方案来演示该问题

Vla*_*ykh 11

在默认项目模板System.Net.Http中,作为参考添加到项目中,而不是作为nuget包.

在您的两个解决方案(4.6.1和4.7.1)中:

  • Project ClassLibrary依赖于System.Net.Httpnuget包.

  • Project ConsoleApp1依赖于System.Net.Http.NET Framework的简单引用

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

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

  1. 在解决方案资源管理器中右键单击解决方案并选择 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.