From Wikipedia (Zh) - Reading time: 12 min
此條目需要更新。 (2020年12月10日) |
此條目可参照英語維基百科相應條目来扩充。 (2021年8月16日) |
| 開發者 | .NET基金会 |
|---|---|
| 首次发布 | 2016年6月27日 |
| 当前版本 |
|
| 源代码库 | |
| 编程语言 | C++和C♯ |
| 操作系统 | Windows、Linux和macOS |
| 类型 | 软件框架 |
| 许可协议 | MIT许可证[2] |
| 网站 | dotnet |
.NET(3.1版以前稱作.NET Core)是微軟開發的第一個跨平台 (Windows、macOS和Linux)的應用程式開發框架(Application Framework),未來也將會支援FreeBSD與Alpine平台。.NET也是微軟在一開始發展時就開源的軟體平台[3],它經常也會拿來和現有的開源 .NET平台Mono比較。
.NET包含 .NET Framework的類別庫,但與 .NET Framework不同的是 .NET採用套件化(Packages)的管理方式,應用程式只需要取得需要的組件即可,與 .NET Framework大包式安裝的作法截然不同,同時各套件亦有獨立的版本線(Version line),不再硬性要求應用程式跟隨主線版本。
.NET專案的主要目標有 [4]:
.NET Core 1.0于2016年6月27日发布。
2020年11月,微软发布了 .NET 5.0[5],统一了.NET的各个平台的碎片版本: .NET Framework 4.8、.NET Standard、.NET Core 3.1、Mono和Xamarin等。
此后,微软每年11月发布一个 .NET 的大版本更新,并将偶数大版本指定为長期支援(LTS)版本。
2021年11月,微软发布了 .NET 6.0[6],为LTS版本,提升了性能并完善了跨平台开发能力。
2022年11月,微软发布了 .NET 7.0[7],进一步提升性能和开发体验,增强了云原生和容器支持。
2023年11月,微软发布了 .NET 8.0[8],作为LTS版本,继续在性能、多平台和AI场景方面优化。
2024年11月,微软发布了 .NET 9.0[9],聚焦性能提升和云原生应用,并持续完善开发工具链。
| 版本 | 发布日期 | 一同发布的产品 | 最新补丁版本 | 补丁发布日期 | 终止支持[10] |
|---|---|---|---|---|---|
| .NET Core 1.0 | 2016-06-27[11] | Visual Studio 2015 Update 3 | 1.0.16 | 2019年5月14日 | 2019年6月27日 |
| .NET Core 1.1 | 2016-11-16[12] | Visual Studio 2017 Version 15.0 | 1.1.13 | 2019年5月14日 | 2019年6月27日 |
| .NET Core 2.0 | 2017-08-14[13] | Visual Studio 2017 Version 15.3 | 2.0.9 | 2018年7月10日 | 2018年10月1日 |
| .NET Core 2.1 | 2018-05-30[14] | Visual Studio 2017 Version 15.7 | 2.1.30 (LTS) | 2021年8月19日 | 2021年8月21日 |
| .NET Core 2.2 | 2018-12-04[15] | Visual Studio 2019 Version 16.0 | 2.2.8 | 2019年11月19日 | 2019年12月23日 |
| .NET Core 3.0 | 2019-09-23[16] | Visual Studio 2019 | 3.0.3 | 2020年2月18日 | 2020年3月3日 |
| .NET Core 3.1 | 2019-12-03[17] | Visual Studio 2019 | 3.1.32 (LTS) | 2022年12月13日 | 2022年12月13日 |
| .NET 5 | 2020-11-10 | Visual Studio 2019 Version 16.8 | 5.0.17 | 2022年5月10日 | 2022年5月10日 |
| .NET 6 | 2021-11-08 | Visual Studio 2022 Version 17.0 | 6.0.36 (LTS) | 2024年11月12日 | 2024年11月12日 |
| .NET 7 | 2022-11-08 | Visual Studio 2022 Version 17.4 | 7.0.20 | 2024年5月29日 | 2024年5月14日 |
| .NET 8 | 2023-11-14 | Visual Studio 2022 Version 17.8 | 8.0.16 (LTS) | 2025年5月13日 | 2026年11月10日 |
| .NET 9 | 2024-11-12 | Visual Studio 2022 Version 17.12 | 9.0.5 | 2025年5月13日 | 2026年5月12日 |
舊版本 舊版本,仍被支援 当前版本 未来版本 | |||||
.NET是由許多專案所組成,除了基本的類別庫(Core FX)之外,也包含採用RyuJIT編譯的執行平台Core CLR、編譯器平台.NET Compiler Platform、採用AOT編譯技術運行最佳化的套件Core RT(.NET Core Runtime),以及跨平台的MSIL編譯器LLILC(LLVM-based MSIL Compiler)等專案。
同時,微軟也發展了一個建置技術文件的平台docfx [18],並運用於 .NET的文件網站。
RyuJIT是微軟發展的新式即地編譯器(Just-in-Time Compiler),用以取代現有的 .NET Framework的JIT以及JIT64即地編譯器,依據微軟公佈的測試報告,RyuJIT的效能較前一代的JIT提升約25%,並支援SIMD(Single Instruction, Multiple Data)的技術。RyuJIT同時應用於 .NET Framework 4.6以及 .NET Core[19]。
Core CLR移植 .NET Framework的CLR的功能,包含核心程式庫mscorlib、JIT編譯器、垃圾收集器(GC)以及其他執行MSIL所需要的執行期環境。
Core RT是以预先编译為主的核心功能,在 .NET Core內稱為Core RT,在UWP則是稱為 .NET Native。
Core RT會在建造時期(非執行期)在編譯時將MSIL轉換成平台原生的機器碼,以獲取較短的啟動時間(JIT採用的是執行時期編譯,使得啟動時間拉長),以及記憶體用量減少的優點。Core RT會在不同的平台使用不同的AOT技術:
LLILC(LLVM-based MSIL Compiler,英文發音為 "lilac")是 .NET在非Windows平台的MSIL編譯器[20],基於ECMA-335(Common Language Infrastructure)的標準將MSIL編譯成原生碼執行,適用於可運行LLVM的作業系統,例如macOS與Linux作業系統。
LLILC同時支援JIT(內含RyuJIT的實作) 以及AOT(未來將開始支援)的編譯方式。
.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平台[21]。
例如下列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,其內包含了這些類別庫套件:
其中的NETStandard.Platform也是一個總括型套件,包含了下列類別庫套件:
開發人員只需要使用NETStandard.Library就能加入所有必要的 .NET Core類別庫參考,但若不需要這麼多組件,也可以只加入特定的套件即可,不一定都要加入NETStandard.Library。
對於微軟來說,.NET Core 1.0(以及早期開發時)使用project.json來處理套件管理與版本相依的問題,是因為很多工具還沒趕上(例如微軟主力的建置工具MSBuild),再加上project.json/xproj架構並不相容於以MSBuild為主的工具鏈 (Toolchain),若是要修改成相容 project.json/xproj 架構的話可能會付出極大成本,因此在 .NET Core 1.0 RC2 發布不久,官方就宣布要將project.json/xproj系統移回到以MSBuild為主的csproj [22],例如下列csproj的例子即可看到套件參考的內容。
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp1.1</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<PackageTargetFallback>$(PackageTargetFallback);portable-net45+win8+wp8+wpa81;</PackageTargetFallback>
</PropertyGroup>
<PropertyGroup>
<UserSecretsId>aspnet-MyCoolWebApplication-e119bc96-38e9-44ab-b4d3-d54964ade9b1</UserSecretsId>
<DockerComposeProjectPath>..\docker-compose.dcproj</DockerComposeProjectPath>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="1.1.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="1.1.2" />
<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="1.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="1.1.1" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="1.1.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer.Design" Version="1.1.1" PrivateAssets="All" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="1.1.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="1.1.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="1.1.1" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="1.1.0" PrivateAssets="All" />
<PackageReference Include="Microsoft.VisualStudio.Web.BrowserLink" Version="1.1.0" />
</ItemGroup>
<ItemGroup>
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.0" />
<DotNetCliToolReference Include="Microsoft.Extensions.SecretManager.Tools" Version="1.0.0" />
<DotNetCliToolReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Tools" Version="1.0.0" />
</ItemGroup>
</Project>
由於 .NET Core移回了MSBuild架構,因此在Visual Studio 2017的 .NET Core工具內,已恢復可直接於IDE的GUI介面中編修套件參考的功能。
.NET基於跨平台能力,在 .NET Core 3.0之前,並沒有將與GUI高度相關的API移植到 .NET Core內,因此像是Windows Forms或是Windows Presentation Foundation(WPF)並未移植到 .NET Core。[23].NET支援主控台應用程式(Console Application)以及類別庫(Class Library)類型的專案。
不過從 .NET Core 3開始,微軟在其Universal Windows Platform(UWP)開發平台使用了 .NET[24],並且利用 .NET Native技術將其效能提升至十分接近原生碼的速度。
ASP.NET Core則以主控台應用程式驅動其代管環境Kestrel Server以支援ASP.NET Core程式的執行。
.NET CLI(Command-Line Interface)指令列工具是 .NET處理建造、執行與編輯工作的主要工具 [25],有幾個主要的動作:
| 指令 | 說明 |
|---|---|
| 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經常會拿來與其他平台做比較,尤其是它的源頭 .NET Framework以及另一個相似性質的開源平台Mono。
據微軟的說明,.NET Core和 .NET Framework是子集(Subset)與超集(Superset)的關係,.NET Core將會實作出部份的 .NET Framework功能 (基本上是不含使用者介面的部份),例如 JIT(.NET Core採用 RyuJIT)、垃圾收集器(GC)以及型別(包含基本型別以及泛型型別等)[26]。.NET Framework与 .NET Core已经在 .NET 5及以后版本合并为统一的 .NET平台。
Mono是另一個已發展許久的 .NET Framework跨平台開源版本,起初由社群主导,并由Xamarin等技术推动了.NET跨平台应用的开发。在.NET Core问世后,微软逐步将跨平台的核心功能和支持纳入微软官方的.NET生态中,最终在.NET5及以后版本将.NET Core和Mono合并至统一的.NET平台。此后不再区分.NET Framework、.NET Core和Mono[26]。
Mono的最后一个大版本于2024年2月发布,之后微软将其移交至Wine进行管理[27]。
然而,Mono仍然具有其特定的用途,例如作为Unity游戏引擎和Xamarin。Android/Xamarin.iOS的运行环境,因为其提供的轻量级JIT编译和AOT(Ahead Of Time)功能。
.NET Core與ASP.NET Core的關係其實一開始並不是主從關係 [28],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 9支援下列作業系統[29] :
| 作業系統 | 版本 | 平台 | 組態 |
|---|---|---|---|
| Windows 10 | Version 1607+ | x64, x86, Arm64 | |
| Windows 11 | Version 2200+ | x64, x86, Arm64 | |
| Windows Server | 2012+ | x64, x86 | 全功能版、Server Core |
| Windows Nano Server | Version 2019+ | x64 | |
| Windows Server Core | 2012+ | x64,x86 | |
| Alpine Linux | 3.19+ | x64, Arm32, Arm64 | |
| CentOS | 9+ | x64, Arm64,ppc664le,s390x | |
| Debian | 12+ | x64, Arm32, Arm64 | |
| Fedora | 40+ | x64, Arm32, Arm64 | |
| OpenSUSE | 15.5+ | x64 | |
| Red Hat Enterprise Linux | 8+ | x64, Arm64 | |
| SUSE Linux Enterprise | 12 SP2+ | x64, Arm64,ppc664le,s390x | |
| Ubuntu | 18.04+ | x64, Arm32, Arm64 | |
| macOS | 13+ | x64, Arm64 | |
| iOS | 16.0+ | Arm64 | |
| tvOS | 12.2+ | Arm64 | |
| Android | API 21+ | x64, Arm32, Arm64 |