【问题标题】:How does .NET resolve different versions of the same package?.NET 如何解析同一个包的不同版本?
【发布时间】:2021-10-30 00:29:14
【问题描述】:

这个问题与 .NET 5+ 相关,而不是 .NET Framework。

考虑以下依赖树:

  • MyWebsite 具有对 RandomWebLibrary 1.0.0 和 RandomJsonLibrary 2.0.0 的包引用。
  • NuGet 包RandomWebLibrary1.0.0 有一个包引用RandomJsonLibrary1.0.0。
  • NuGet 包RandomJsonLibrary 没有依赖关系。

我的问题:

  1. 运行时将加载哪些版本的RandomJsonLibrary
  2. 如果RandomJsonLibrary 2.0.0 的API 与RandomJsonLibrary 1.0.0 完全不同会怎样?
  3. MyWebsite 的作者能否解决因在依赖关系树中有多个版本的RandomJsonLibrary 而引起的问题? .NET 5+ 中是否有等效于 .NET Framework 的绑定重定向?

我是出于好奇而不是因为我遇到了问题。作为参考,这里是Understanding AssemblyLoadContext 上的文档,看起来相关但没有回答我的问题。

【问题讨论】:

标签: nuget .net-5 assembly-resolution


【解决方案1】:

文档页面How NuGet resolves package dependencies 回答了这些问题。 “使用 PackageReference 解决依赖关系”部分与此问题相关,因为我们正在讨论 .NET 5+。

当应用程序的包图包含同一包的不同版本时,NuGet 会选择图中最接近应用程序的包并忽略所有其他包。此行为允许应用程序覆盖任何依赖图中的特定包版本。

在下面的示例中,应用程序直接依赖包 B,版本约束为 >=2.0。该应用程序还依赖于包 A,而包 A 又依赖于包 B,但具有 >=1.0 的约束。因为对 Package B 2.0 的依赖更接近图中的应用程序,所以使用该版本:

回答原来的问题:

  1. RandomJsonLibrary 2.0.0 将在运行时加载。
  2. 相信如果RandomJsonLibrary 1.0.0 和2.0.0 的API 不兼容,RandomWebLibrary 将在运行时抛出异常。
  3. MyWebsite 的作者可以通过将依赖包直接安装到MyWebsite 来选择任何依赖包的确切版本。对于RandomJsonLibraryMyWebsite 的作者可能应该降级到RandomJsonLibrary 1.0.0 以防止RandomWebLibrary 崩溃。 AFAIK 在 .NET 5+ 中没有绑定重定向。

【讨论】:

  • 感谢@martin-ullrich 为我指出了相应的文档。另外,如果我在这个答案中有任何细节错误,请告诉我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多