开发者 | Microsoft |
---|---|
预览版本 | 1.0.0-rc1(2015年11月18日 | )
编程语言 | C# |
类型 | 跨平台应用程式框架 |
许可协议 | MIT License |
网站 | .NET Core Home |
.NET Core 是.NET Framework的新一代版本,是微软第一个官方版本,具有跨平台 (Windows、Mac OSX、Linux) 能力的应用程式开发框架 (Application Framework),未来也将会支援 FreeBSD 与 Alpine 平台,也是微软在一开始发展时就开源的软体平台 [1],它经常也会拿来和现有的开源 .NET 平台 Mono 比较。
由于 .NET Core 的开发目标是跨平台的 .NET 平台,因此 .NET Core 会包含 .NET Framework 的类别库,但与 .NET Framework 不同的是 .NET Core 采用套件化 (Packages) 的管理方式,应用程式只需要取得需要的组件即可,与 .NET Framework 大包式安装的作法截然不同,同时各套件亦有独立的版本线 (Version line),不再硬性要求应用程式跟随主线版本。
.NET Core 专案的主要目标有 [2]:
- 支援或可以移转 (port) 到更多的作业系统平台与晶片架构 (也就是未来计画会跨出 x86 平台)。
- 具有引人注目的效能与高可靠度。
- 开发人员能快速与直觉的获取 .NET Core 开发环境。
- 在直觉与具生产力的情况下建造应用程式,使用文件,范例与 NuGet 元件。
核心功能
.NET Core 是由许多专案所组成,除了基本的类别库 (Core FX) 之外,也包含采用 RyuJIT 编译的执行平台 Core CLR、编译器平台 .NET Compiler Platform、采用 AOT 编译技术込行最佳化的套件 Core RT (.NET Core Runtime),以及跨平台的 MSIL 编译器 LLILC (LLVM-based MSIL Compiler) 等专案。
同时,微软也发展了一个建置技术文件的平台 docfx [3],并运用于 .NET Core 的文件网站。
RyuJIT
RyuJIT 是微软发展的新式即地编译器 (Just-in-Time Compiler),用以取代现有的 .NET Framework 的 JIT 以及 JIT64 即地编译器,依据微软公布的测试报告,RyuJIT 的效能较前一代的 JIT 提升约 25%,并支援 SIMD (Single Instruction, Multiple Data) 的技术。RyuJIT 同时应用于 .NET Framework 4.6 以及 .NET Core[4]。
Core CLR
Core CLR 移植 .NET Framework 的 CLR 的功能,包含核心程式库 mscorlib、JIT 编译器、垃圾收集器 (GC) 以及其他执行 MSIL 所需要的执行期环境。
Core RT
Core RT 是以 AOT (Ahead-of-time) 编译方式为主的核心功能,在 .NET Core 内称为 Core RT,在 UWP 则是称为 .NET Native。
Core RT 会在建造时期 (非执行期) 在编译时将 MSIL 转换成平台原生的机器码,以获取较短的启动时间 (JIT 采用的是执行时期编译,使得启动时间拉长),以及记忆体用量减少的优点。Core RT 会在不同的平台使用不同的 AOT 技术:
- Windows 上使用的是 .NET Native。
- Mac OS 与 Linux 上使用的是 LLILC (同时支援 JIT 和 AOT)。
LLILC
LLILC (LLVM-based MSIL Compiler,英文发音为 "lilac") 是 .NET Core 在非 Windows 平台的 MSIL 编译器[5],基于 ECMA-335 (Common Language Infrastructure) 的标准将 MSIL 编译成原生码执行,适用于可运行 LLVM 的作业系统,例如 Mac OSX 与 Linux 作业系统。
LLILC 同时支援 JIT (内含 RyuJIT 的实作) 以及 AOT (未来将开始支援) 的编译方式。
Roslyn
.NET Compiler Platform (专案代码为 Roslyn) 是将 .NET 平台的编译架构标准化的平台,它可提供程式管理工具 (如整合开发环境) 相当多的情报,用以发展有助于编写程式与管理程式结构所需要的功能,例如型别资讯、语法结构、参考连结、语意、编译器、自动化、错误回报等等功能,只要是遵循 CLI 标准的程式语言,都可以利用 .NET Compiler Platform 实作出编译器,让程式管理工具能实作如语法提示、语法自动完成、关键字高亮等视觉化能力。
.NET Compiler Platform 可同时支援 .NET Framework 4.6 以上版本,.NET Core 也原生支援。
套件管理
.NET Core 的类别库采用 NuGet 套件化的架构,应用程式只需要使用 project.json 的 dependencies 区段加入指定套件版本的参考,就能获得该套件的功能,与以往 .NET Framework 大包式的提供方法完全不同。.NET Core 团队宣布己经有 98% 的 .NET Framework 主要类别库移转到 .NET Core 平台[6]。
例如下列 project.json 内容,可直接加入 .NET Standard Library (v1.0.0-rc2-23901) 的参考。
{
"version": "1.0.0-*",
"compilationOptions": {
"emitEntryPoint": true
},
"dependencies": {
"NETStandard.Library": "1.0.0-rc2-23901"
},
"frameworks": {
"netstandardapp1.5": {
"imports": "dnxcore50"
}
}
}
.NET Standard Library 是一个总括型的 NuGet Package,其内包含了这些类别库套件:
- Microsoft.DotNet.CoreHost
- NETStandard.Platform
- System.Collections.Concurrent
- System.Linq
- System.Runtime.Numerics
- System.Text.RegularExpressions
其中的 NETStandard.Platform 也是一个总括型套件,包含了下列类别库套件:
- Microsoft.NETCore.Platforms
- Microsoft.NETCore.Runtime
- Microsoft.Win32.Primitives
- System.AppContext
- System.Collections
- System.Diagnostics.Debug
- System.Diagnostics.Tools
- System.Diagnostics.Tracing
- System.Globalization
- System.Globalization.Calendars
- System.IO
- System.IO.FileSystem
- System.IO.FileSystem.Primitives
- System.Net.Primitives
- System.Net.Sockets
- System.Reflection
- System.Reflection.Extensions
- System.Reflection.Primitives
- System.Reflection.TypeExtensions
- System.Runtime
- System.Runtime.Extensions
- System.Runtime.Handles
- System.Runtime.InteropServices
- System.Runtime.InteropServices.RuntimeInformation
- System.Text.Encoding
- System.Text.Encoding.Extensions
- System.Threading
- System.Threading.Tasks
- System.Threading.Timer
开发人员只需要使用 NETStandard.Library 就能加入所有必要的 .NET Core 类别库参考,但若不需要这么多组件,也可以只加入特定的套件即可,不一定都要加入 NETStandard.Library。
应用程式类型
.NET Core 基于跨平台能力,并没有将与 GUI 高度相关的 API 移植到 .NET Core 内,因此像是 Windows Forms 或是 Windows Presentation Foundation (WPF) 并未移植到 .NET Core。.NET Core 支援主控台应用程式 (Console Application) 以及类别库 (Class Library) 类型的专案。
不过微软在其 Universal Windows Platform (UWP) 开发平台使用了 .NET Core[7],并且利用 .NET Native 技术将其效能提升至十分接近原生码的速度。
.NET CLI
.NET CLI (Command-Line Interface) 指令列工具是 .NET Core 处理建造、执行与编辑工作的主要工具 [8],有几个主要的动作:
指令 | 说明 |
---|---|
dotnet new | 产生新的基本 .NET 专案内容 (包含 project.json、Program.cs 以及 NuGet.config) |
dotnet restore | 还原所参考的 NuGet 套件 |
dotnet build | 建造 .NET 专案 |
dotnet publish | 产生可发行的 .NET 专案 (包含所属的 Runtime) |
dotnet run | 编译与立即执行 .NET 专案 (较适用于 exe 型专案) |
dotnet repl | 启动互动式的对话 |
dotnet pack | 将专案的产出封装成 NuGet 套件 |
与其他平台的关系
.NET Core 经常会拿来与其他平台做类比,尤其是它的源头 .NET Framework 以及另一个相似性质的开源平台 Mono。
.NET Framework
据微软的说明,.NET Core 和 .NET Framework 是子集 (Subset) 与超集 (Superset) 的关系,.NET Core 将会实作出部份的 .NET Framework 功能 (基本上是不含使用者介面的部份),例如 JIT (.NET Core 采用 RyuJIT)、垃圾收集器 (GC) 以及型别 (包含基本型别以及泛型型别等)[9]。未来 .NET Framework 和 .NET Core 也将会是各自发展,但它们也会同时使用彼此的功能,例如 .NET Compiler Platform 与 RyuJIT 等技术。
Mono
Mono 是另一个已发展许久的 .NET Framework 跨平台开源版本,基本上并不隶属微软官方,而是由社群的力量所主导,自成一个生态系统,也开发出了像Xamarin这样的跨平台.NET行动应用,.NET Core 与 Mono 未来会是合作的关系,Mono 仍会维持社群力量的维护与发展,而 .NET Core 则会以官方角度来进行发展,两边也会一起进行彼此功能上的增进[9]。
与 ASP.NET Core 的关系
.NET Core 与 ASP.NET Core 的关系其实一开始并不是主从关系 [10],ASP.NET Core 的开发初期 (ASP.NET 5) .NET Core 还没有开始起跑,因此 ASP.NET Core 当时有自己的执行期与工具,一开始称为 Project K,后来改为 DNX (.NET Execution Environment),DNX 本身就具有可独立运作的执行能力,不需要依赖 .NET Core 执行,但是这样会变成 .NET Core 和 ASP.NET Core 双头马车的现象,在 .NET Core 逐渐成熟之后,微软也决定要将这两个各自独立发展的产品线整合在一起,DNX 也将因改用 .NET Core 执行期而终止开发,DNX 的功能将由 .NET Core 以及旗下的 .NET CLI 接替提供,整合后的版本将在 1.0 RC2 时释出。
支援作业系统
.NET Core 的 1.0 版本将支援下列作业系统 [2]:
作业系统 | 版本 | 平台 | 组态 |
---|---|---|---|
Windows 用户端 | 7 SP1~10 | x64, x86 | |
Windows 伺服器 | R2 SP1~Windows Server 2016 | x64, x86 | 全功能版、Server Core 与 Nano Server (Windows Server 2016 Only) |
Debian | 8.2 | x64 | |
Red Hat Enterprise Linux | 7.2 | x64 | |
Ubuntu | 14.04 LTS | x64 | |
CentOS | 7.1 | x64 | |
Mac OSX | 10.11 (EI Capitan) | x64 |
参考
- ^ Overview of .NET Implementations
- ^ 2.0 2.1 NET Core Roadmap
- ^ Generate your API documentation with DocFX
- ^ JIT Compiler Structure
- ^ LLILC Architecture Overview
- ^ Announcing .NET Core and ASP.NET 5 RC
- ^ .NET and Universal Windows Platform Development
- ^ Intro to .NET Core CLI
- ^ 9.0 9.1 .NET Core Home
- ^ About .NET Core