首页 > 解决方案 > 如何解决dotnet核心中的nuget依赖地狱?

问题描述

我正在开发一个包含几个不同项目的 asp.net 核心解决方案,每个项目都使用某个版本库的第 3 方 NuGet 包。这些版本(例如 1.0.0 和 2.0.0)具有重大更改。另外,这个库是由另一个项目组开发的,不受我的影响。因此,将来会有与另一个不兼容的版本,我的限制是在特定项目中使用一个确切的版本。

以下是该解决方案的简要概述:

在 Visual Studio 中进行开发期间,一切都很好,我可以在每个项目中使用我的版本库的各个方法。如果我最终发布我的应用程序,那么只有一个CustomLibrary.dll

我对此有点困惑。这个 dll 是否同时包含两个版本,并且 dotnet 可以在运行时解析它们吗?如果不是这种情况,应用程序将在运行时失败,因为 v1.0.0 的方法和输出可能与 v2.0.0 完全不同。

(在 .Net 框架中我可以做到这一点,但它似乎不适用于 .Net Core)

是否有部署同一强名称库的不同版本的解决方案?我想应该可以部署特定版本的 NuGet 包?

如果您能帮助我,我将不胜感激。

标签: c#.net-coredeploymentnuget

解决方案


有几个 .NET Core 架构限制会影响应用程序设计:

  1. 不能同时将同一程序集的不同版本加载到单个 .NET Core 进程中。此限制将阻止您的应用同时使用这两个项目。
  2. 没有发布过程可以神奇地将程序集的两个版本组合成一个通用程序集。

牢记这一点,您需要在运行时重新设计您的应用程序并使用 CustomLibrary v1.0.0 动态加载 Project1。Project2 也是如此。您应该最终得到一个新架构,其中 Project1 和 Project2 将发布到不同的文件系统位置并在运行时动态加载。

在这种情况下,您的应用程序需要在其生命周期内同时使用 Project1 和 Project2,如果您的程序集可以与可收藏的 AssemblyLoadContext 很好地配合使用,这是可能的。该场景将是 Project1 和 Project2 都能够使用可收集的 AssemblyLoadContext 加载和卸载,并且应用程序将根据需要在它们之间切换。

希望这将有助于解决问题。


推荐阅读