系统。*引入NETStandard.Library依赖项时的参考问题

时间:2018-01-02 11:34:15

标签: c# nuget visual-studio-2017

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

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

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

  

消息:System.IO.FileLoadException:无法加载文件或程序集&System; Net.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解决方案来证明问题here

1 个答案:

答案 0 :(得分:11)

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

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

  • 项目ClassLibrary依赖于System.Net.Http作为nuget包。

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

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

  

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

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

  2. 切换到Installed标签

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

  4. 检查当前状态:

  5. Initial state of references to System.Net.Http nuget package

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

    2. 检查结果:

    3. Fixed state of references to System.Net.Http nuget package

      1. 重建解决方案。
      2. 完成。

        此外,最好在您的解决方案中整合软件包版本。相反,您可能会在构建期间出现版本冲突。或者,更糟糕的是,运行时错误如MethodNotFound,因为绑定重定向到另一个版本的依赖项。

        此处描述了System.Net.Http问题的原因: {{3>}部分如何防止此类情况发生? 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