如何解决dotnet核心中的nuget依赖地狱?

Bur*_*rdH 6 c# deployment nuget .net-core

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

以下是该解决方案的最小概述:

  • 我的解决方案
    • 网络应用程序
    • 项目1
      • 自定义库 (v1.0.0)
    • 项目2
      • 自定义库 (v2.0.0)

在 Visual Studio 的开发过程中,一切都很好,我可以在每个项目中使用我的版本库的各个方法。如果我最终发布我的应用程序,输出文件夹中只有一个v2.0.0 的 CustomLibrary.dll

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

(.NET Framework中我能做到这样,但似乎并不在.net中的核心应用)

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

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

Jac*_*ski 0

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

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

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

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

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