【问题标题】:System.* reference troubles when introducing NETStandard.Library dependency引入 NETStandard.Library 依赖时的 System.* 引用问题
【发布时间】:2018-01-02 11:34:14
【问题描述】:

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

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

这会导致众所周知的运行时问题 f.e.:

消息:System.IO.FileLoadException:无法加载文件或程序集“System.Net.Http,版本=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

【问题讨论】:

  • 对于 4.7.1 及以上版本以外的 .NET Framework,您根本没有选择,只能做您现在正在做的事情。 4.7.1 及更高版本默认提供 shim 组件,您不再需要这样做。更多内容blogs.msdn.microsoft.com/dotnet/2017/10/17/…
  • 4.7.1 仍然需要其中一些程序集,因为 4.7.1 中存在错误 - 它附带了错误的程序集版本。
  • @WouterHuysentruit,目前看来,切换到最新的框架 4.7.1 是一个可行的选择。您可以在获得更好的解决方案之前将您的评论转换为回答并接受它,这样可以帮助遇到相同问题的其他社区成员。
  • 啊,搞砸了。将 Moq 更新到 4.8.0 取决于 System.Threading.Tasks.Extensions 4.4.0,现在很多单元测试都为 System.Net.Http 抛出 FileLoadException。我要烧掉这个地方了:p
  • 有几次类似的情况,通常匹配的 .net 版本不正确和/或构建顺序可能不是这种情况,但无论如何都值得检查。

标签: c# nuget visual-studio-2017


【解决方案1】:

在默认项目模板中,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. 检查当前状态:

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

  2. 查看结果:

  1. 重建解决方案。

完成。


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


System.Net.Http 出现问题的原因如下所述: Broken System.Net.Http 4.1.1-4.3.0 post-mortem如何防止以后出现这种情况? 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

【讨论】:

  • 我不确定只有这两个包。在我们的解决方案中,构建会为很多包生成警告(未找到程序集),例如 Microsoft.Win32、System.ValueTuple 等...
  • 其他问题可能与this有关。
  • 帮我解决了同样的问题,但使用了 'System.Threading.Tasks.Extensions' 包
猜你喜欢
  • 2013-08-25
  • 2023-01-18
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多