.NET

**.NET**（3.1版以前稱作**.NET Core**）是微軟開發的第一個跨平台 （Windows、macOS和Linux）的應用程式開發框架（Application Framework）。.NET也是微軟在一開始發展時就開源的軟體平台，它經常也會拿來和現有的開源 .NET平台Mono比較。

.NET包含 .NET Framework的類別庫，但與 .NET Framework不同的是 .NET採用套件化（Packages）的管理方式，應用程式只需要取得需要的組件即可，與 .NET Framework大包式安裝的作法截然不同，同時各套件亦有獨立的版本線（Version line），不再硬性要求應用程式跟隨主線版本。

.NET專案的主要目標有 ：

# 支援或可以移轉（port）到更多的作業系統平台與晶片架構（也就是未來計畫會跨出x86平台）。
# 具有引人注目的效能與高可靠度。
# 開發人員能快速與直覺的獲取 .NET開發環境。
# 在直覺與具生產力的情況下建造應用程式、使用文件、範例與NuGet元件。

## 历史
.NET Core 1.0于2016年6月27日发布。

2020年11月，微软发布了 .NET 5.0，统一了.NET的各个平台的碎片版本： .NET Framework 4.8、.NET Standard、.NET Core 3.1、Mono和Xamarin等。

此后，微软每年11月发布一个 .NET 的大版本更新，并将偶数大版本指定为長期支援（LTS）版本。

2021年11月，微软发布了 .NET 6.0，为LTS版本，提升了性能并完善了跨平台开发能力。

2022年11月，微软发布了 .NET 7.0，进一步提升性能和开发体验，增强了云原生和容器支持。

2023年11月，微软发布了 .NET 8.0，作为LTS版本，继续在性能、多平台和AI场景方面优化。

2024年11月，微软发布了 .NET 9.0，聚焦性能提升和云原生应用，并持续完善开发工具链。

2025年11月，微软发布了 .NET 10.0。

## 核心功能

.NET是由許多專案所組成，除了基本的類別庫（Core FX）之外，也包含採用RyuJIT編譯的執行平台Core CLR、編譯器平台、採用AOT編譯技術運行最佳化的套件Core RT（.NET Core Runtime），以及跨平台的MSIL編譯器LLILC（LLVM-based MSIL Compiler）等專案。

同時，微軟也發展了一個建置技術文件的平台docfx ，並運用於 .NET的文件網站。

### 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。

### Core CLR

Core CLR移植 .NET Framework的CLR的功能，包含核心程式庫mscorlib、JIT編譯器、垃圾收集器（GC）以及其他執行MSIL所需要的執行期環境。

### Core RT

Core RT是以為主的核心功能，在 .NET Core內稱為Core RT，在UWP則是稱為 .NET Native。

Core RT會在建造時期（非執行期）在編譯時將MSIL轉換成平台原生的機器碼，以獲取較短的啟動時間（JIT採用的是執行時期編譯，使得啟動時間拉長），以及記憶體用量減少的優點。Core RT會在不同的平台使用不同的AOT技術：

* Windows上使用的是 .NET Native。
* macOS與Linux上使用的是LLILC（同時支援JIT和AOT）。

### LLILC
LLILC（**LL**VM-based MS**IL** **C**ompiler，英文發音為 "lilac"）是 .NET在非Windows平台的MSIL編譯器，基於ECMA-335（Common Language Infrastructure）的標準將MSIL編譯成原生碼執行，適用於可運行LLVM的作業系統，例如macOS與Linux作業系統。

LLILC同時支援JIT（內含RyuJIT的實作） 以及AOT（未來將開始支援）的編譯方式。

因为RyuJIT的跨平台能力与性能逐渐追上，LLILC的Github仓库已于2022年被归档，不再维护 

### Roslyn

.NET Compiler Platform（專案代碼為Roslyn）是將 .NET平台的編譯架構標準化的平台，它可提供程式管理工具 （如整合開發環境） 相當多的情報，用以發展有助於編寫程式與管理程式結構所需要的功能，例如型別資訊、語法結構、參考連結、語意、編譯器、自動化、錯誤回報等等功能，只要是遵循CLI標準的程式語言，都可以利用 .NET Compiler Platform實作出編譯器，讓程式管理工具能實作如語法提示、語法自動完成、關鍵字高亮等視覺化能力。

.NET Compiler Platform可同時支援 .NET Framework 4.6以上版本，.NET Core也原生支援。

## 套件管理

### .NET Core v1.0時期

.NET Core的類別庫採用NuGet套件化的架構，應用程式只需要使用project.json的dependencies區段加入指定套件版本的參考，就能獲得該套件的功能，與以往 .NET Framework大包式的提供方法完全不同。.NET Core團隊宣佈已經有98%的 .NET Framework主要類別庫移轉到 .NET Core平台。

例如下列project.json內容，可直接加入 .NET Standard Library（v1.0.0-rc2-23901）的參考。


```json
{
    "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 v1.1時期

對於微軟來說，.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 ，例如下列csproj的例子即可看到套件參考的內容。


```xml
<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。.NET支援主控台應用程式（Console Application）以及類別庫（Class Library）類型的專案。

不過從 .NET Core 3開始，微軟在其Universal Windows Platform（UWP）開發平台使用了 .NET，並且利用 .NET Native技術將其效能提升至十分接近原生碼的速度。

ASP.NET Core則以主控台應用程式驅動其代管環境Kestrel Server以支援ASP.NET Core程式的執行。

## .NET CLI

.NET CLI（Command-Line Interface）指令列工具是 .NET處理建造、執行與編輯工作的主要工具 ，有幾個主要的動作：

## 與其他平台的關係

.NET經常會拿來與其他平台做比較，尤其是它的源頭 .NET Framework以及另一個相似性質的開源平台Mono。

### .NET Framework

據微軟的說明，.NET Core和 .NET Framework是子集（Subset）與超集（Superset）的關係，.NET Core將會實作出部份的 .NET Framework功能 （基本上是不含使用者介面的部份），例如 JIT（.NET Core採用 RyuJIT）、垃圾收集器（GC）以及型別（包含基本型別以及泛型型別等）。.NET Framework与 .NET Core已经在 .NET 5及以后版本合并为统一的 .NET平台。

### Mono

Mono是另一個已發展許久的 .NET Framework跨平台開源版本，起初由社群主导，并由Xamarin等技术推动了.NET跨平台应用的开发。在.NET Core问世后，微软逐步将跨平台的核心功能和支持纳入微软官方的.NET生态中，最终在.NET5及以后版本将.NET Core和Mono合并至统一的.NET平台。此后不再区分.NET Framework、.NET Core和Mono。

Mono的最后一个大版本于2024年2月发布，之后微软将其移交至Wine进行管理。

然而，Mono仍然具有其特定的用途，例如作为Unity游戏引擎和Xamarin。Android/Xamarin.iOS的运行环境，因为其提供的轻量级JIT编译和AOT（Ahead Of Time）功能。

## 與ASP.NET Core的關係

.NET Core與ASP.NET Core的關係其實一開始並不是主從關係 ，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支援下列作業系統 ：

## 參考