.NET
.NET 平臺是一個(gè)開發(fā)框架段标,支持多種編程語言涯冠,用于構(gòu)建各種類型的應(yīng)用程序,包括桌面應(yīng)用逼庞、Web 應(yīng)用蛇更、移動應(yīng)用、云服務(wù)等赛糟。這個(gè)平臺由 Microsoft 提供派任,并以其強(qiáng)大的工具和類庫著稱
云應(yīng)用
跨平臺客戶端應(yīng)用
Windows 應(yīng)用
其他應(yīng)用類型
功能
借助 .NET 功能璧南,開發(fā)人員可以高效地編寫可靠的高性能代碼
- 異步代碼
- 屬性
- 反射
- 代碼分析器
- 委托和 lambda
- 事件
- 異常
- 垃圾回收
- 泛型類型
- LINQ(語言集成查詢)掌逛。
- 并行編程和托管線程
- 類型推理 - C#、F#司倚、Visual Basic豆混。
- 類型系統(tǒng)
- 不安全代碼
運(yùn)行時(shí)
公共語言運(yùn)行時(shí) (CLR) 是生成所有 .NET 應(yīng)用的基礎(chǔ)。 運(yùn)行時(shí)的基本功能包括:
- 垃圾回收
- 內(nèi)存安全和類型安全
- 對編程語言的全面支持
- 跨平臺設(shè)計(jì)
.NET 有時(shí)被稱為“托管代碼”運(yùn)行時(shí)动知。 之所以稱為“托管”皿伺,主要是因?yàn)樗褂美厥掌鬟M(jìn)行內(nèi)存管理,還因?yàn)樗鼜?qiáng)制執(zhí)行類型和內(nèi)存安全盒粮。 CLR 虛擬化(或抽象)了各種操作系統(tǒng)和硬件概念鸵鸥,例如內(nèi)存、線程和異常
CLR 從一開始就被設(shè)計(jì)為一個(gè)跨平臺運(yùn)行時(shí)丹皱。 它已被移植到多個(gè)操作系統(tǒng)和體系結(jié)構(gòu)妒穴。 通常,跨平臺 .NET 代碼不需要經(jīng)過重新編譯就能在新環(huán)境中運(yùn)行摊崭。 相反嗅榕,你只需安裝一個(gè)不同的運(yùn)行時(shí)即可運(yùn)行應(yīng)用
運(yùn)行時(shí)為調(diào)試器冈闭、轉(zhuǎn)儲和跟蹤工具以及可觀測性公開各種診斷服務(wù)和 API乖坠。 可觀測性實(shí)現(xiàn)主要是圍繞 OpenTelemetry 構(gòu)建的已维,可實(shí)現(xiàn)靈活的應(yīng)用程序監(jiān)視和站點(diǎn)可靠性工程 (SRE)淆攻。
運(yùn)行時(shí)通過結(jié)合使用 P/Invoke、值類型以及跨本機(jī)/托管代碼邊界對值進(jìn)行 blit 的功能嘿架,提供低級別的 C 樣式互操作功能瓶珊。
運(yùn)行時(shí)庫
.NET 具有一組全面的標(biāo)準(zhǔn)類庫。 這些庫為許多常規(guī)用途類型和特定于工作負(fù)載的類型和實(shí)用工具功能提供實(shí)現(xiàn)耸彪。
下面是在 .NET 運(yùn)行時(shí)庫中定義的一些類型示例:
- 每個(gè) .NET 類型都派生自 System.Object 類型
- 基元值類型伞芹,如 System.Boolean 和 System.Int32
- 集合,例如 System.Collections.Generic.List<T> 和 System.Collections.Generic.Dictionary<TKey,TValue>
- 數(shù)據(jù)類型蝉娜,例如 System.Data.DataSet 和 System.Data.DataTable
- 網(wǎng)絡(luò)實(shí)用程序類型唱较,如 System.Net.Http.HttpClient
- 文件和流 I/O 實(shí)用程序類型,如 System.IO.FileStream 和 System.IO.TextWriter
- 序列化實(shí)用程序類型召川,例如 System.Text.Json.JsonSerializer 和 System.Xml.Serialization.XmlSerializer
- 高性能類型南缓,例如 System.Span<T>、System.Numerics.Vector 和 System.Span<T>
有關(guān)詳細(xì)信息荧呐,請參閱運(yùn)行時(shí)庫概述
.NET 歷史信息
- 2002 年汉形,Microsoft 發(fā)布了 .NET Framework,這是用于創(chuàng)建 Windows 應(yīng)用的開發(fā)平臺
- 2014 年倍阐,Microsoft 推出了 .NET Core 作為 .NET Framework 的跨平臺開源后續(xù)產(chǎn)品概疆,可在 Windows、Linux 和 macOS 上運(yùn)行
- 2020年峰搪,.NET 5是.NET Core 3.1 之后的下一個(gè)版本去掉了名稱中的“Core”部分岔冀,.NET 5標(biāo)志著.NET Core和.NET Framework的合并。之前概耻,這兩者是分開開發(fā)和維護(hù)的使套,.NET 5將它們整合為一個(gè)平臺,為跨平臺和一致性提供更好的支持
- 2021年鞠柄, .NET 6繼續(xù)加強(qiáng).NET 5的合并版本侦高,并提供更多的功能和改進(jìn),包括對Windows春锋、Linux矫膨、macOS等平臺的支持差凹,性能改進(jìn)期奔,新的C#語言特性等,.NET 6 是從 .NET 5 開始的 .NET 統(tǒng)一計(jì)劃的最后部分危尿,跨平臺呐萌、桌面、IoT 和云應(yīng)用的統(tǒng)一的SDK谊娇、基本庫和運(yùn)行時(shí)(Runtime) 都在 .NET 6 統(tǒng)一
- 2022年肺孤,.NET 7 建立在 .NET 6 建立的基礎(chǔ)之上,.NET 7 主要關(guān)注領(lǐng)域包括:
- 改進(jìn)對 云原生 方案的支持
- 升級舊項(xiàng)目的工具
- 簡化開發(fā)人員使用容器的難度
- 2023年,.NET8 又帶來了很多方面的增強(qiáng)赠堵,比如:Blazor 開發(fā)框架小渊、人工智能、云原生.NET Aspire茫叭、性能酬屉、native AOT 等
- .NET 5、.NET 6揍愁、.NET 7 和 .NET 8 是具有一組統(tǒng)一功能和 API 的單一產(chǎn)品呐萨,可用于 Windows 桌面應(yīng)用和跨平臺控制臺應(yīng)用、云服務(wù)和網(wǎng)站
基于以上版本莽囤,歸類目前.net 的主要版本有:
.NET Framework
.NET Framework 是管理面向 .NET Framework 的應(yīng)用的運(yùn)行時(shí)執(zhí)行環(huán)境谬擦。 它包括公共語言運(yùn)行時(shí)(提供內(nèi)存管理和其他系統(tǒng)服務(wù))和一個(gè)全面的類庫(使程序員能利用強(qiáng)大可靠的代碼實(shí)現(xiàn)所有主要領(lǐng)域的應(yīng)用開發(fā))
什么是 .NET Framework?
NET Framework 是 Windows 的托管執(zhí)行環(huán)境朽缎,可為其運(yùn)行的應(yīng)用提供各種服務(wù)
主要組件
.NET Framework包括兩個(gè)主要組件:
- 公共語言運(yùn)行時(shí) (CLR)惨远,它是處理運(yùn)行應(yīng)用的執(zhí)行引擎
- 執(zhí)行托管代碼:其中包括將源代碼編譯為中間語言(IL,Intermediate Language)饵沧,并在運(yùn)行時(shí)將 IL 代碼轉(zhuǎn)換為本機(jī)代碼
- 垃圾回收:用于管理應(yīng)用程序的內(nèi)存锨络。它負(fù)責(zé)分配和釋放內(nèi)存,防止內(nèi)存泄漏和懸空引用
- 內(nèi)存安全和類型安全:通過代碼訪問權(quán)限和代碼驗(yàn)證來確保.NET 應(yīng)用程序的安全性狼牺。它實(shí)施了代碼訪問安全策略羡儿,以確保應(yīng)用程序不會執(zhí)行危險(xiǎn)的操作
- 異常處理機(jī)制:能處理.NET 應(yīng)用程序中的異常,提供了一套強(qiáng)大的異常處理機(jī)制是钥,允許開發(fā)者編寫并捕獲異常掠归,并確保程序在異常情況下能夠高效地處理
- 對編程語言的全面支持:允許在同一應(yīng)用程序中使用多種語言編寫的組件
- .NET Framework 類庫,它提供開發(fā)人員可從其自己的應(yīng)用中調(diào)用的已測試悄泥、可重用代碼庫
- Base Class Library虏冻,BCL:包含了許多基本的類和類型,用于處理字符串弹囚、集合厨相、IO操作、異常處理等
- WPF:用于構(gòu)建富客戶端應(yīng)用程序的UI框架鸥鹉,支持XAML語法蛮穿,使開發(fā)者能夠創(chuàng)建現(xiàn)代化、可視化的用戶界面
- WCF:用于構(gòu)建分布式服務(wù)的框架毁渗,支持創(chuàng)建服務(wù)導(dǎo)向的應(yīng)用程序践磅,并提供通信、安全灸异、事務(wù)等功能
- Windows Forms:用于創(chuàng)建傳統(tǒng)的桌面應(yīng)用程序的UI框架府适,通過可視化設(shè)計(jì)工具和事件驅(qū)動模型羔飞,使界面開發(fā)更加簡便
- ADO.NET:用于訪問和操作數(shù)據(jù)庫的框架,提供了一系列的類和方法檐春,支持連接到各種數(shù)據(jù)庫系統(tǒng)
- ASP.NET:用于構(gòu)建Web應(yīng)用程序的框架逻淌,支持創(chuàng)建動態(tài)網(wǎng)頁、處理HTTP請求和響應(yīng)疟暖、管理用戶會話等
- LINQ:提供一種統(tǒng)一的查詢語法恍风,使開發(fā)者能夠在C#或VB.NET代碼中方便地進(jìn)行數(shù)據(jù)查詢和操作
以下是 CLR 和類庫與應(yīng)用之間以及與整個(gè)系統(tǒng)之間的關(guān)系
服務(wù)
.NET Framework 提供的用于運(yùn)行應(yīng)用的服務(wù)包括:
- 內(nèi)存管理:CLR 代表應(yīng)用負(fù)責(zé)分配和釋放內(nèi)存并處理對象生存期
- 常規(guī)類型系統(tǒng): 基本類型由 .NET Framework 類型系統(tǒng)定義,且是面向 .NET Framework 的所有語言所共有的
- 一個(gè)全面的類庫:處理常見的低級編程操作時(shí)誓篱,可通過 .NET Framework 類庫使用類型及其成員的易訪問庫
- 開發(fā)框架和技術(shù):NET Framework 包括用于特定區(qū)域應(yīng)用開發(fā)的庫
- 用于 Web 應(yīng)用的 ASP.NET
- 用于數(shù)據(jù)訪問的 ADO.NET
- 用于面向服務(wù)的應(yīng)用的 Windows Communication Foundation(WCF)
- 用于 Windows 桌面應(yīng)用的 Windows Presentation Foundation(WPF)
- 語言互操作性
- 面向 .NET Framework 的語言編譯器發(fā)出名為公共中間語言 (CIL) 的中間代碼
- 版本兼容性
- 并行執(zhí)行
- 多定向
.NET Core
.NET Core 和 .NET Framework 是 Microsoft 的兩個(gè)不同的軟件框架朋贬,主要用于開發(fā)和運(yùn)行跨平臺的應(yīng)用程序
內(nèi)容
- .NET Core 支持跨平臺運(yùn)行,支持在Windows窜骄、Linux 和 macOS 平臺運(yùn)行
- .NET Core 不支持傳統(tǒng)的 Windows Forms 和 WPF 桌面應(yīng)用程序锦募,但支持面向現(xiàn)代云應(yīng)用和微服務(wù)的框架
- .NET Core 相對于.NET Framework 具有更先進(jìn)的包管理系統(tǒng),支持依賴注入邻遏,對于依賴關(guān)系能更為靈活的處理
- 與 .NET Framework 使用的 運(yùn)行時(shí) CLR 不同糠亩,.NET Core 采用全新的跨平臺運(yùn)行時(shí) Core CLR
- .NET Core 適用于 云、微服務(wù)准验、Web API赎线、跨平臺應(yīng)用程序
- .NET Core 引入了 Blazor WebAssembly 項(xiàng)目,允許在瀏覽器中運(yùn)行 .NET 應(yīng)用程序
- .NET Core 支持 C# 8.0
注意:.NET Core 目前已經(jīng)合并進(jìn) .NET 5 中糊饱,并由后續(xù)的 .NET 5 及更高的版本進(jìn)行推進(jìn)
.NET 5
.NET 5 是繼 .NET Core 3.1 之后 .NET Core 的下一個(gè)主要版本垂寥,與 NET Core 或 .NET Framework 相比,.NET 5 會支持類型更多的應(yīng)用和平臺
內(nèi)容
- .NET 5 合并了 .NET Core 和 .NET Framework 的特性另锋,統(tǒng)一為一個(gè)單一的 .NET 平臺
- .NET 5 繼續(xù)支持跨平臺滞项,并增加了對 Windows、Linux 和 macOS 的更廣泛的支持
- NET 5 引入了對 Windows Forms 和 WPF 的支持夭坪,使得開發(fā)者能夠在 .NET 5 中使用這些傳統(tǒng)框架
- .NET 5 進(jìn)一步加強(qiáng)了 Blazor WebAssembly文判,并提供更多的 WebAssembly 支持
- .NET 5 引入了新的 .NET SDK,整合了 .NET Core 和 .NET Framework 的開發(fā)工具
- .NET 5 提供對 .NET Standard 類庫的支持室梅,可以更方便地在各種 .NET 平臺中重用類庫
- .NET 5 支持多種應(yīng)用類型戏仓,包括 ASP.NET Core、Blazor亡鼠、控制臺應(yīng)用赏殃、Windows 窗體、WPF 等
- .NET 5 引入了 C# 9.0拆宛,并提供了一些新的語言特性
- .NET 5引入了一些性能優(yōu)化和新的 JIT 編譯器
- .NET 5 不會替換 .NET Framework嗓奢,也不會替代 .NET Standard
改進(jìn)和新功能
- C# 更新
- F# 更新
- Visual Basic 更新
- System.Text.Json 新功能
- 單一文件應(yīng)用
- 應(yīng)用剪裁
- Windows Arm64 和 Arm64 內(nèi)部函數(shù)
- 轉(zhuǎn)儲調(diào)試的工具支持
- 對于可以為 null 的引用類型讼撒,運(yùn)行時(shí)庫的批注百分比為 80%
- 性能改進(jìn):
注意:
- .NET 5 版本跳過編號 4.x浑厚,以避免與 .NET Framework 4.x 混淆股耽,并從名稱中刪除了“Core”,強(qiáng)調(diào) .NET 未來的主要實(shí)現(xiàn)
- SP.NET Core 5.0 雖以 .NET 5 為基礎(chǔ)钳幅,但保留了名稱“Core”以避免與 ASP.NET MVC 5 混淆
- Entity Framework Core 5.0 保留了名稱“Core”物蝙,以避免與 Entity Framework 5 和 Entity Framework 6 混淆
.NET 6
.NET 6 提供 .NET 統(tǒng)一計(jì)劃的最終部分,該計(jì)劃在 .NET 5 中啟動敢艰。 .NET 6 在移動诬乞、桌面、IoT 和云應(yīng)用之間統(tǒng)一了 SDK钠导、基礎(chǔ)庫和運(yùn)行時(shí)
內(nèi)容
- .NET 6 繼續(xù)提升跨平臺性能震嫉,并支持 Windows、Linux牡属、macOS票堵、iOS、Android 和瀏覽器 WebAssembly
- 進(jìn)一步改進(jìn)了 ASP.NET Core逮栅,并提供了新的 Web 開發(fā)功能悴势,包括 Blazor 的增強(qiáng)支持
- .NET 6 繼續(xù)增強(qiáng) Windows Forms 和 WPF 的支持,提供更多功能
- .NET 6 引入了新的 .NET SDK措伐,整合了 .NET Core 和 .NET Framework 的開發(fā)工具
- .NET 6 提供了更多的類庫和框架特纤,以支持更廣泛的應(yīng)用類型,包括移動應(yīng)用侥加、嵌入式設(shè)備捧存、云原生應(yīng)用等
- .NET 6 支持 Windows、Azure 和云原生應(yīng)用的更好集成担败,包括對 Windows ARM64 的支持
- .NET 6 進(jìn)一步支持多種應(yīng)用類型矗蕊,包括 ASP.NET Core、Blazor氢架、控制臺應(yīng)用傻咖、Windows 窗體、WPF 等
- .NET 6 引入了 C# 10.0岖研,提供了新的語言特性
- .NET 6 繼續(xù)優(yōu)化性能卿操,提供更好的運(yùn)行時(shí)性能和資源利用率
改進(jìn)和新功能
- JIT 性能改進(jìn)
- Crossgen2
- Arm64 支持
- 熱重載
- .NET MAUI
- C# 10 和 模板
- F#
- SDK 工作負(fù)載
- System.Text.Json APIs
- 源生成器
- 可寫 DOM
- IAsyncEnumerable 序列化
- 其他新 API
- HTTP/3
- ASP.NET Core
- OpenTelemetry
- .NET 包驗(yàn)證
- 性能改進(jìn):
.NET 7
.NET 7 是 .NET 6 的后繼版本,側(cè)重于統(tǒng)一孙援、新式害淤、簡單和快速的特點(diǎn)
內(nèi)容
- .NET 7 的多平臺應(yīng)用程序 UI (MAUI) 將 Android、iOS拓售、macOS 和 Windows API 統(tǒng)一到一個(gè)API中窥摄,以提供了一個(gè)項(xiàng)目來處理跨設(shè)備及其平臺的多目標(biāo)
- .NET 7 進(jìn)一步改進(jìn)了 ASP.NET Core
- .NET 7 繼續(xù)增強(qiáng) Windows 窗體 和 WPF 的支持,提供更多功能
- .NET 庫 API 做出了許多改進(jìn)
- .NET 7 對反射础淤、堆棧替換 (OSR)崭放、啟動時(shí)間哨苛、本機(jī) AOT、循環(huán)優(yōu)化和許多其他領(lǐng)域進(jìn)行優(yōu)化改進(jìn)
- .NET 7 改進(jìn)了 Arm64 的代碼生成 和 正則表達(dá)式
- .NET 7 SDK 提升了 CLI 模板體驗(yàn)
- .NET 7 改進(jìn)了可觀測性币砂,幫助了解在應(yīng)用縮放時(shí)以及技術(shù)復(fù)雜性增加時(shí)應(yīng)用的狀態(tài)
- .NET 7 引入了 C# 11建峭,提供了新的語言特性
改進(jìn)和新功能
- C# 11
- F# 7
- .NET MAUI
- ASP.NET Core
- EF Core
- Windows 窗體
-
WPF
.NET 升級助手和 CoreWCF - System.Text.Json 序列化
- 正則表達(dá)式
- .NET 類庫
- 可觀察性 - OpenTelemetry
- ML.NET
- 性能改進(jìn)
.NET 7 文檔更新:https://learn.microsoft.com/zh-cn/dotnet/whats-new/dotnet-7-docs
.NET 8
.NET 8 是 .NET 7 的后繼版本,著重強(qiáng)調(diào)云决摧、性能亿蒸、全棧 Blazor、AI 和 Native AOT 是.NET 8的主要亮點(diǎn)
內(nèi)容
- .NET 8 提供云就緒堆棧.NET Aspire掌桩,.NET Aspire是一個(gè)用于使用 .NET 構(gòu)建彈性边锁、可觀察和可配置的云原生應(yīng)用程序的堆棧
- .NET 8 可以無需等待 JIT(即時(shí))編譯器在運(yùn)行時(shí)編譯代碼,無需部署JIT編譯器和IL代碼波岛。AOT 應(yīng)用程序僅部署應(yīng)用程序所需的代碼砚蓬,應(yīng)用程序現(xiàn)在可以在不允許使用 JIT 編譯器的受限環(huán)境中運(yùn)行
- .NET 8 中的 Blazor 可以同時(shí)使用服務(wù)器和客戶端來處理所有的 Web UI 需求,通過專注于優(yōu)化頁面加載時(shí)間盆色、可擴(kuò)展性和提升用戶體驗(yàn)的多項(xiàng)新增強(qiáng)功能灰蛙,可以在同一應(yīng)用程序中使用Blazor Server 和 Blazor WebAssembly,在運(yùn)行時(shí)自動將用戶從服務(wù)器轉(zhuǎn)移到客戶端
- .NET 8 可以通過 .NET SDK 中的AI 功能以及與多種工具的無縫集成來輕松利用 AI
- .NET MAUI 提供單一項(xiàng)目系統(tǒng)和單一代碼庫來構(gòu)建 WinUI隔躲、Mac Catalyst摩梧、iOS 和 Android 應(yīng)用程序
- 使用 .NET 比以往更輕松、更安全地使用容器打包應(yīng)用程序宣旱。每個(gè) .NET 映像都包含一個(gè)非 root 用戶仅父,從而通過單行配置啟用更安全的容器
改進(jìn)和新功能
- .NET Aspire
- ASP.NET Core
- Core .NET 庫:
- .NET MAUI
.NET 8 的新增功能: https://learn.microsoft.com/zh-cn/dotnet/core/whats-new/dotnet-8?source=recommendations
備注: 由于.NET 8 由2023年11月24 發(fā)布,作為長期支持版本浑吟,目前仍處于維護(hù)階段笙纤,故
- 新框架可能存在一些未知的問題和漏洞,這會影響到開發(fā)的穩(wěn)定性和可靠性
- 新框架可能與現(xiàn)有的代碼庫和工具不兼容组力,這會導(dǎo)致一些問題和限制
- 新框架可能還沒有完善的文檔和社區(qū)支持省容,這會給開發(fā)人員帶來很大的困擾
- 新框架可能存在一些潛在的風(fēng)險(xiǎn)因素,如安全問題燎字、性能問題等腥椒,這會影響到開發(fā)的效率和質(zhì)量
.NET Standard
.NET Standard 是一種規(guī)范,定義了一組API候衍,用于在不同的.NET平臺上實(shí)現(xiàn)可移植的代碼笼蛛。它的目的是為不同的 .NET 平臺提供一致的API,以便開發(fā)人員可以編寫可移植的代碼蛉鹿,而不必?fù)?dān)心運(yùn)行時(shí)環(huán)境的不同
.NET Standard 版本控制規(guī)則
- 累加性:.NET Standard 較高的版本會包含較低版本的所有 API
- 不可變:一旦發(fā)布滨砍,.NET Standard 版本就會凍結(jié)起來
.NET Standard 實(shí)現(xiàn)形式
- .NET Standard 引用程序集的主要分發(fā)載體是 NuGet 包,實(shí)現(xiàn)會以適用于每個(gè) .NET 實(shí)現(xiàn)的各種方式提供
- NuGet 包面向一個(gè)或多個(gè)框架 + .NET Standard 包面向“.NET Standard”框架
.NET Standard 問題
- API 的限制:由于 .NET Standard 是為了提供一組共享 API 而創(chuàng)建的,因此它可能會限制某些特定框架或平臺上可用的 API惋戏;
.NET 5+ 中的解決方案:實(shí)現(xiàn)某項(xiàng)功能時(shí)领追,該功能便已可供所有 .NET 5+ 應(yīng)用和庫使用,因?yàn)榇a基底是共享的
- 版本控制問題:由于 .NET Standard 是一個(gè)版本化的框架日川,API 規(guī)范與其實(shí)現(xiàn)的分離導(dǎo)致 API 規(guī)范版本與實(shí)現(xiàn)版本之間出現(xiàn)復(fù)雜的映射,因此可能會出現(xiàn)版本控制問題矩乐,例如需要使用不同版本的 .NET Standard 來支持不同的 API龄句;
NET 5+ 中的解決方案: .NET 5+ API 規(guī)范與 它的 實(shí)現(xiàn)之間不存在任何分離
- 兼容性問題:由于 .NET Standard 是為了解決 .NET Framework、.NET Core 和 Xamarin 之間的兼容性問題而創(chuàng)建的散罕,.NET Standard 公開了特定于平臺的 API分歇,因此當(dāng)它在不具有給定 API 實(shí)現(xiàn)的平臺上運(yùn)行時(shí),可能會出現(xiàn)與其他框架或平臺不兼容的問題欧漱;
.NET 5+ 中的解決方案:.NET 5+ SDK 包括默認(rèn)啟用的代碼分析器职抡。 平臺兼容性分析器會檢測在其上運(yùn)行的平臺所不支持的 API 的意外使用情況
本文知識點(diǎn)存在一定局限性,具體疑難點(diǎn)請參考官網(wǎng):https://learn.microsoft.com/zh-cn/dotnet/core/introduction