.NET Core不仅仅是 .NET Core 运行时,它由一整套的工具链和库组成。

1.2.1 .NET Core 运行时 (CLR)

什么是运行时?简而言之,运行时就是一个完整高级的虚拟机,支持多种编程语言以及它们的互操作。.NET Core 有两种运行时,CoreCLR 和 CoreRT

CoreCLR (Core Common Language Runtime ) 包含RyuJIT编译器、垃圾回收、核心库mscorlib以及其他组件,它是即时编译运行时,在程序运行时,它使用 RyuJIT 一句一句将 IL 编译为机器码执行,这种方式也称为动态编译。

CoreRT(Core Runtime)是为了预编译 (AOT)优化的运行时。说到AOT不得不提.NET的预编译技术.NET Native,它是将IL字节码编译成机器码的工具链。.NET Native默认使用开源且跨平台的RyuJIT作为AOT编译器,也就是CoreCLR中使用的RyuJIT编译器。当然它也可以使用其他编译器,如LLILCIL to CPP。CoreRT的基础是一个小型的本地执行引擎,提供了诸如垃圾回收 (GC) 的服务,和CoreCLR中的GC一样。CoreRT提供了一套.NET的AOT机制,编译后会生成单个文件,包含程序,依赖和CoreCRT,这样就可以不用依赖.NET运行时运行它了。这种方式也称为静态编译。

1.2.2 .NET Core 基础类库

.NET Core 实现了一系列的类库,称为 CoreFX,它是 .NET Standard 的跨平台实现,包含 System.Collections, System.IO, System.Xml 等。基础框架库的跨平台是.NET Core跨平台非常重要的部分,否则,一些基础的功能如文件操作都要用户实现,还要跨平台,可想而知。

1.2.3 .NET Core CLI和Roslyn

.NET Core CLI 和 Roslyn 包含在.NET Core SDK,通过安装 SDK 就能获取到。

.NET Core CLI 是用于构建、管理 .NET Core 项目的工具,它包含编译、NuGet 包管理、运行、测试等命令。在 .NET Core 开发中经常用到的dotnet run、dotnet add package 命令,就是 .NET Core CLI 提供的。

Roslyn 是微软开源的新一代编译平台,支持 C# 和 VB,它不仅具有编译功能,还提供丰富的代码分析API。Roslyn 是将 C# 或 VB 写的源代码编译为 IL,RyuJIT 是将 IL 编译为机器码,两者是不同的。

1.2.4 CoreHost

CoreHost 在.NET Core CLI 项目中,.NET Core 程序启动时,它负责加载运行时和程序集。