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

时间:2019-12-06 11:04:45

标签: c# .net-core deployment nuget

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

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

  • 我的解决方案
    • WebApp
    • Project1
      • CustomLibrary(v1.0.0)
    • Project2
      • CustomLibrary(v2.0.0)

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

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

(在.Net框架中,我可以做this,但似乎不适用于.Net Core)

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

如果您能帮助我,我将非常感谢。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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