.NET Core有没有类似于GAC的东西?

46

据我当前的理解,在完整的.NET Framework中,当我们将框架安装到计算机上时,它会将整个BCL部署到计算机的GAC中。这样,当我们使用.NET开发软件并在该计算机上部署它时,它将使用在安装.NET Framework本身时在GAC中提供的BCL程序集。

现在,据我所知,CoreFX是新的.NET Core的BCL等效物。然而,主要区别在于,我们可以在project.json中明确指定需要哪些CoreFX的部分。

我的问题是:当我们部署.NET Core应用程序时,生产环境中是否有与GAC等价的内容?因此,当我们部署该应用程序以执行时,是否有任何中央位置在计算机上查找整个CoreFX是否可用的位置?


AOT编译(Ahead-Of-Time)很可能成为创建可部署可执行文件的主要方式,完全不需要框架。这对于避免冷启动非常必要。CoreRT项目正在研究此问题。当你从现在开始一年后再问这些问题时,它们会更有用。 - Hans Passant
我看到CoreRT将负责进行AOT编译,最终将生成本地可执行文件。但是还有CoreCLR与JIT编译一起工作,对吗?在这种情况下,如果使用它,是否有类似于GAC的东西,可以搜索来自CoreFX的程序集? - user1620696
2个回答

37

编辑于2017-09-01

.NET Core 2.0引入了"运行时包存储",类似于GAC:

从.NET Core 2.0开始,可以针对已知的一组在目标环境中存在的包来打包和部署应用程序。其优点是部署速度更快、磁盘空间使用更少,在某些情况下还能提高启动性能。

这个功能通过运行时包存储实现,即一个存储包的磁盘目录(在macOS/Linux上通常为/usr/local/share/dotnet/store,在Windows上为C:/Program Files/dotnet/store)。


您正在寻找"框架相关部署"。参见文档:

您可以为.NET Core应用程序创建两种部署方式:

  • 框架相关部署。如名称所示,框架相关部署(FDD)依赖于目标系统上已安装的.NET Core共享系统版本。由于.NET Core已经存在,因此您的应用程序也可以在.NET Core的不同安装之间移植。您的应用程序仅包含其自己的代码和任何位于.NET Core库外的第三方依赖项。FDD包含可以通过命令行使用dotnet实用程序启动的.dll文件。例如,dotnet app.dll运行名为app的应用程序。

  • 自包含部署。与FDD不同,自包含部署(SCD)不依赖于目标系统上的任何共享组件。所有组件,包括.NET Core库和.NET Core运行时,都包含在应用程序中,并与其他.NET Core应用程序隔离。SCD包括一个可执行文件(例如Windows平台上的app.exe,用于名为app的应用程序),它是平台特定的.NET Core主机的重命名版本,以及一个.dll文件(例如app.dll),它是实际的应用程序。


SCD 不是 Docker 中使用的方法吗? - Hameed Syed

13

没有,至少不是你想的GAC那种方式。核心应用程序旨在彼此隔离,因此您可以在不影响其他应用程序的情况下修补一个应用程序。您需要将所有需要的软件包与应用程序一起发布。

有一个服务目录可用于发布Core组件的更新,但这只是为了完全替换它们,而不是启用并行版本控制,并且仅适用于通过Microsoft Update发布的更新。


谢谢 @blowdart。我知道对于 .NET Core,我们可以将所有需要的包与应用程序一起发布,但我以为这只是一个选项。所以在开发 .NET Core 应用程序时,我们总是需要将包与应用程序一起发布吗? - user1620696
有本地缓存的概念,至少在DNX中是这样,但当您本地运行时,会覆盖它。这更适用于“丢失”的软件包。 - blowdart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接