gpt4 book ai didi

c# - System.* 引入 NETStandard.Library 依赖项时的引用问题

转载 作者:IT王子 更新时间:2023-10-29 04:08:19 26 4
gpt4 key购买 nike

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

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

这会导致众所周知的运行时问题,例如:

Message: System.IO.FileLoadException : Could not load file or assembly 'System.Net.Http, Version=4.1.1.2, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

深入研究NETStandard.Library 包的依赖关系,我们可以看到这些包中也存在同样的问题:

  • 系统.集合。*
  • System.ComponentModel.*
  • 系统.控制台
  • 系统.全局化。*
  • System.IO.*
  • System.Linq.*
  • System.Net.*
  • 系统对象模型
  • System.Reflection.*
  • System.Resources.ResourceManager
  • System.Runtime.*
  • System.Text.*
  • System.Threading.*
  • System.Xml.*

通常这是通过在其他项目中安装相同的包来解决的,但是我们在这里处理很多项目和很多包,我不想盲目地将所有这些依赖项添加到所有 52 个项目中.

这让我想知道是否有人知道一种简单的方法来从这种情况中恢复并使所有项目从 NuGet 包文件夹引用正确的包/DLL(如果他们当前使用 NET Framework 内部包)。

可在 net462 和 net471 上找到演示该问题的简单 VS 解决方案 here

最佳答案

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

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

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

  • 项目 ConsoleApp1 依赖于 System.Net.Http 作为 .NET Framework 的简单引用

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

To fix the issue add the same version of System.Net.Http as a nuget package to all projects (where it is used).

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

  2. 切换到已安装标签

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

  4. 检查当前状态:

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

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

  2. 查看结果:

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

  1. 重建解决方案。

完成。


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


System.Net.Http 问题的原因描述如下: Broken System.Net.Http 4.1.1-4.3.0 post-mortem如何防止将来出现这种情况? 2.1

部分

As a result we identified 2 problematic OOB packages, which are not leaf-nodes in the platform itself, and have dependency from the platform on them - System.Net.Http and System.IO.Compression.

这意味着相同的 System.Net.Http 库在 .NET Framework 中作为 OOB(带外)nuget 包提供。一些 nuget 包可以引用它的 nuget 版本。这就是我在一开始描述的问题。

因此,您不必修复对所有 System.* 库的引用。仅适用于这两个:System.Net.HttpSystem.IO.Compression

关于c# - System.* 引入 NETStandard.Library 依赖项时的引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48060230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com