关于C#:如何解决dotnet核心中的nuget依赖地狱?

How to solve nuget dependency hell in dotnet core?

我正在使用几个不同的项目在asp.net核心解决方案上进行开发,每个项目都使用某个版本库的第三方NuGet软件包。这些版本,例如1.0.0和2.0.0具有重大变化。此外,该库是由另一个项目团队开发的,不会受到我的影响。
因此,将来会有与其他版本不兼容的版本,而我的限制是在特定项目中使用一个确切的版本。

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

  • 我的解决方案

    • 网络应用
    • 项目1

      • CustomLibrary(v1.0.0)
    • 项目2

      • CustomLibrary(v2.0.0)

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

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

(在.Net框架中,我可以执行此操作,但似乎不适用于.Net Core)。

是否存在解决方案,以部署相同强名称库的不同版本?
我想应该可以部署特定版本的NuGet软件包吗?

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


.NET Core的一些体系结构限制将影响应用程序设计:

  • 无法将一个人同时加载到同一程序集的不同版本的单个.NET Core中。此限制将阻止您的应用程序同时使用两个项目。
  • 没有任何发布过程可以将程序集的两个版本神奇地组合为一个通用程序集。
  • 请记住这一点,您将需要重新设计应用程序,并在运行时动态地使用CustomLibrary v1.0.0加载Project1。 Project2也是如此。您应该以一种新的体系结构结束,在该体系结构中,Project1和Project2将发布到不同的文件系统位置,并在运行时动态加载。

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

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