.NET 6 運行時的幾乎所有功能都是通過大量托管類型公開的。這些類型組織到分層命名空間中,并打包到一組程序集中。
某些 .NET 類型由 CLR 直接使用,對于托管宿主環境至關重要。這些類型駐留在名為 的程序集中.dll包括 C# 的內置類型以及基本集合類,以及用于流處理、序列化、反射、線程處理和本機互操作性的類型。
.dll取代了.NET Framework的。官方文檔中的許多地方仍然提到mscorlib。
在此級別之上是“充實”CLR 級別功能的其他類型,提供 XML、JSON、網絡和語言集成查詢等功能。它們構成了基類庫 (BCL)。位于此之上的是應用程序,它們提供用于開發特定類型的應用程序(如 Web 或富客戶端)的 API。
在本章中,我們提供以下內容:
在 .NET 6 中,基類庫具有許多新功能。特別:
.NET 6 還對運行時進行了大量性能改進,并增強了對 Windows ARM64 和 Apple M1/M2 處理器的支持。
在應用層,最大的變化是引入了 MAUI(多平臺應用 UI,2022 年初),它取代了 Xamarin 進行跨平臺移動開發。MAUI 還支持 macOS 和 Windows 的跨平臺桌面應用程序開發,并面向統一的 .NET 6 CLR/BCL。UWP還有一個繼任者,Windows App SDK(以WinUI 3作為其表示層),并且出現了一種稱為Blazor Desktop的新技術,用于編寫基于HTML的桌面和移動應用程序。
如果 NuGet 上提供的大量公共庫僅支持 .NET 6,則它們的價值就不那么高了。編寫庫時,通常需要支持各種平臺和運行時版本。若要在不為每個運行時創建單獨的生成的情況下實現該目標,必須以最低公分母為目標。如果您只希望支持 .NET 6 的直接前身,這相對容易:例如,如果您面向 .NET Core 3.0,您的庫將在 .NET Core 3.0、.NET Core 3.1 和 .NET 5+ 上運行。
如果您還想支持.NET Framework或Xamarin,情況會變得更加混亂。這是因為這些運行時中的每一個都有一個具有重疊功能的 CLR 和 BCL — 沒有一個運行時是其他運行時的純子集。
通過定義跨整個舊運行時范圍的人工子集來解決此問題。通過面向 .NET Standard,您可以輕松編寫具有廣泛影響力的庫。
.NET 標準不是運行時;它只是一個描述功能(類型和成員)的最小基線的規范,以保證與一組特定的運行時兼容。該概念類似于 C# 接口:.NET Standard 類似于具體類型(運行時)可以實現的接口。
最有用的版本是。面向 .NET Standard 2.0 而不是特定運行時的庫將在目前仍在使用的大多數新式和舊版運行時上運行,而無需修改,包括:
若要面向 .NET 標準 2.0,請將以下內容添加到 文件中:
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<PropertyGroup>
本書中描述的大多數 API 都受 .NET Standard 2.0 支持。
NET Standard 2.1 是 .NET Standard 2.0 的超集,它(僅)支持以下平臺:
任何版本的.NET Framework(甚至UWP都不支持.NET Standard 2.1),因此它比.NET Standard 2.0有用得多。
特別是以下 API 在 .NET Standard 2.1(但不是 .NET Standard 2.0)中可用:
還有較舊的.NET標準,最值得注意的是1.1,1.2,1.3和1.6。編號較高的標準始終是編號較低的標準的嚴格超集。例如,如果您編寫一個面向 .NET Standard 1.6 的庫,則不僅支持最新版本的主要運行時,還支持 .NET Core 1.0。如果您的目標是 .NET Standard 1.3,則支持我們已經提到的所有內容以及 .NET Framework 4.6.0。下表詳細說明了。
如果您定位... | 你也支持... |
標準 1.6 | .NET Core 1.0 |
標準 1.3 | 以上加上 .NET 4.6.0 |
標準 1.2 | 以上加上.NET 4.5.1,Windows Phone 8.1,WinRT for Windows 8.1 |
標準 1.1 | 以上加上.NET 4.5.0,Windows Phone 8.0,WinRT for Windows 8.0 |
1.x標準缺少2.0中存在的數千個API,包括我們在本書中描述的大部分內容。這可能會使面向 1.x 標準更具挑戰性,尤其是在需要集成現有代碼或庫時。
您還可以將 .NET Standard 視為最低公分母。對于 .NET Standard 2.0,實現它的運行時具有類似的 BCL,因此最低公分母很大且有用。但是,如果您還希望與 .NET Core 1.0(BCL 大幅減少)兼容,則最低公分母 .NET Standard 1.x 將變得更小且不太有用。
由于 .NET Framework 已經存在了很長時間,因此遇到 .NET Framework 的庫(沒有 .NET Standard、.NET Core 或 .NET 6 等效項)的情況并不少見。為了幫助緩解這種情況,允許 .NET 5+ 和 .NET Core 項目引用 .NET Framework 程序集,但附帶條件如下:
實際上,它最有可能在簡單情況下工作,例如包裝非托管 DLL 的程序集。
默認情況下,項目的運行時版本確定使用的 C# 語言版本:
這是因為更高版本的 C# 依賴于僅在更高運行時中可用的類型。
您可以使用 <LangVersion> 元素覆蓋項目文件中的語言版本。將較舊的運行時(如 .NET 5)與較新的語言版本(如 C# 10)一起使用意味著依賴于較新的 .NET 類型的語言功能將不起作用(盡管在某些情況下,你可以自己定義這些類型)。
以 .NET Standard 為目標時,項目會隱式引用名為 的程序集,該程序集包含所選版本的 .NET Standard 允許的所有類型和成員。這稱為,因為它的存在只是為了編譯器的利益,并且不包含已編譯的代碼。在運行時,“真正的”程序集通過程序集重定向屬性進行標識(程序集的選擇將取決于程序集最終在哪個運行時和平臺上運行)。
有趣的是,當您面向 .NET 6 時,也會發生類似的事情。項目隱式引用一組引用程序集,這些程序集的類型反映所選 .NET 版本的運行時程序集中的內容。這有助于實現版本控制和跨平臺兼容性,還允許你將目標定位為與計算機上安裝的版本不同的 .NET 版本。
最基本的類型直接位于 System 命名空間中。其中包括 C# 的內置類型、異常基類、枚舉、數組和委托基類,以及可為空、類型、日期時間、時間跨度和 Guid。系統命名空間還包括用于執行數學函數(數學)、生成隨機數(隨機)以及在各種類型之間轉換(轉換和位轉換器)的類型。
介紹了這些類型以及定義跨.NET用于格式化(IFormattable)和順序比較(IComparable)等任務的標準協議的接口。
System 命名空間還定義了用于與垃圾回收器交互的 IDisposable 接口和 GC 類,我們將在第 中介紹。
命名空間包含 StringBuilder 類(字符串的可編輯或表親)和用于處理文本編碼的類型,如 UTF-8(編碼及其子類型)。我們將在第中介紹這一點。
命名空間包含執行基于模式的高級搜索和替換操作的類型;我們將在第中描述這些。
.NET 提供了各種用于管理項集合的類。其中包括基于列表和字典的結構;它們與一組統一其共同特征的標準接口協同工作。所有集合類型都在以下命名空間中定義,如所述:
System.Collections // Nongeneric collections
System.Collections.Generic // Generic collections
System.Collections.Specialized // Strongly typed collections
System.Collections.ObjectModel // Bases for your own collections
System.Collections.Concurrent // Thread-safe collection (Chapter 22)
語言集成查詢 (LINQ) 允許您對本地和遠程集合(例如 SQL Server 表)執行類型安全查詢,如第 章到 章所述。LINQ 的一大優點是,它跨各種域提供一致的查詢 API。基本類型駐留在以下命名空間中:
System.Linq // LINQ to Objects and PLINQ
System.Linq.Expressions // For building expressions manually
System.Xml.Linq // LINQ to XML
XML和JSON在.NET中得到廣泛支持。完全關注 LINQ to XML,這是一種可以通過 LINQ 構造和查詢的輕量級 XML 文檔對象模型 (DOM)。介紹了高性能的低級XML讀取器/編寫器類,XML模式和樣式表,以及使用JSON的類型:
System.Xml // XmlReader, XmlWriter
System.Xml.Linq // The LINQ to XML DOM
System.Xml.Schema // Support for XSD
System.Xml.Serialization // Declarative XML serialization for .NET types
System.Xml.XPath // XPath query language
System.Xml.Xsl // Stylesheet support
System.Text.Json // JSON reader/writer and DOM
在 的在線補充中,我們將介紹 JSON 序列化程序。
在第 中,我們將介紹日志記錄和斷言,并描述如何與其他進程交互、寫入 Windows 事件日志以及處理性能監視。此類型在“系統診斷”中和“系統診斷”下定義。
許多現代應用程序需要同時處理多件事情。從 C# 5.0 開始,通過異步函數和高級構造(如任務和任務組合器)這變得更加容易。在從多線程的基礎知識開始之后詳細解釋了所有這些。用于處理線程和異步操作的類型位于 System.Threading 和 System.Threading.Tasks 命名空間中。
.NET 為低級別輸入/輸出 (I/O) 提供基于流的模型。流通常用于直接讀取和寫入文件和網絡連接,并且可以鏈接或包裝在裝飾器流中以添加壓縮或加密功能。描述了流體系結構以及對處理文件和目錄、壓縮、管道和內存映射文件的特定支持。流和 I/O 類型在 System.IO 命名空間中和之下定義,文件 I/O 的 Windows 運行時 (WinRT) 類型位于 Windows.Storage 中和下。
您可以通過 System.Net 中的類型直接訪問大多數標準網絡協議,例如 HTTP、TCP/IP 和 SMTP。在第 中,我們將演示如何使用這些協議中的每一種進行通信,從簡單的任務開始,例如從網頁下載,最后直接使用 TCP/IP 檢索 POP3 電子郵件。以下是我們介紹的命名空間:
System.Net
System.Net.Http // HttpClient
System.Net.Mail // For sending mail via SMTP
System.Net.Sockets // TCP, UDP, and IP
C# 程序編譯到的程序集包括可執行指令(存儲為 IL)和元數據,后者描述程序的類型、成員和屬性。通過反射,可以在運行時檢查此元數據,并執行動態調用方法等操作。使用 Reflection.Emit ,您可以動態構建新代碼。
在第中,我們描述了程序集的構成以及如何動態加載和隔離它們。在第 中,我們將介紹反射和屬性 — 描述如何檢查元數據、動態調用函數、編寫自定義屬性、發出新類型以及解析原始 IL。用于使用反射和使用程序集的類型駐留在以下命名空間中:
System
System.Reflection
System.Reflection.Emit
在第中,我們將介紹動態編程和利用動態語言運行時(DLR)的一些模式。我們描述了如何實現模式,編寫自定義動態對象以及與IronPython進行互操作。動態規劃的類型位于 System.Dynamic 中。
.NET 為流行的哈希和加密協議提供了廣泛的支持。在第 中,我們將介紹哈希、對稱和公鑰加密以及 Windows 數據保護 API。此類型在以下位置定義:
System.Security
System.Security.Cryptography
C# 的異步函數使并發編程變得更加容易,因為它們減少了對較低級別技術的需求。但是,有時仍然需要信令構造、線程本地存儲、讀取器/寫入器鎖定等。對此進行了深入的解釋。線程類型位于 System.Threading 命名空間中。
在第 中,我們將詳細介紹利用多核處理器的庫和類型,包括用于任務并行性、命令式數據并行性和功能并行性 (PLINQ) 的 API。
為了幫助微優化性能熱點,CLR 提供了多種類型來幫助您以減少內存管理器負載的方式進行編程。其中兩種關鍵類型是 Span<T> 和 Memory<T> ,我們將在第 中描述。
可以與本機代碼和組件對象模型 (COM) 代碼進行互操作。本機互操作性允許您調用非托管 DLL 中的函數、寄存回調、映射數據結構以及與本機數據類型進行互操作。COM 互操作性允許您調用 COM 類型(在 Windows 計算機上),并向 COM 公開 .NET 類型。支持這些功能的類型在 System.Runtime.InteropServices 中,我們將在第 中介紹它們。
在第 中,我們將介紹如何使用正則表達式來匹配字符串中的字符模式。
.NET 提供了多個系統,用于將對象保存和還原為二進制或文本表示形式。此類系統可用于通信以及將對象保存和還原到文件中。在 的聯機補充中,我們介紹了所有四個序列化引擎:二進制序列化程序、(新更新的)JSON 序列化程序、XML 序列化程序和數據協定序列化程序。
C# 編譯器本身是用 C# 編寫的,該項目稱為“Roslyn”,庫以 NuGet 包的形式提供。使用這些庫,除了將源代碼編譯到程序集之外,還可以以多種方式利用編譯器的功能,例如編寫代碼分析和重構工具。我們在 的在線增刊中介紹了羅斯林。
基于用戶界面 (UI) 的應用程序可分為兩類:客戶端(相當于網站)和(最終用戶必須在計算機或移動設備上下載并安裝的程序)。
對于用C#編寫瘦客戶端應用程序,有 ASP.NET Core,它可以在Windows,Linux和macOS上運行。ASP.NET Core也是為編寫Web API而設計的。
對于富客戶端應用程序,可以選擇 API:
還有第三方庫,例如Avalonia,它提供跨平臺的UI支持。
ASP.NET Core 是 ASP.NET 的輕量級模塊化繼承者,適用于創建網站、基于 REST 的 Web API 和微服務。它還可以與兩個流行的單頁應用程序框架一起運行:React和Angular。
ASP.NET 支持流行的 (MVC) 模式,以及稱為 Blazor 的新技術,其中客戶端代碼是用 C# 而不是 JavaScript 編寫的。
ASP.NET Core 在 Windows、Linux 和 macOS 上運行,并且可以在自定義進程中自托管。與其前身.NET Framework(ASP.NET)不同,ASP.NET Core不依賴于System.Web和Web表單的歷史包袱。
與任何瘦客戶端體系結構一樣,ASP.NET Core 與富客戶端相比具有以下一般優勢:
Windows 桌面應用程序層提供了兩種用于編寫胖客戶端應用程序的 UI API 選擇:WPF 和 Windows 窗體。這兩個 API 都在 Windows Desktop/Server 7 到 11 上運行。
WPF 于 2006 年推出,此后得到了增強。與其前身 Windows 窗體不同,WPF 使用 DirectX 顯式呈現控件,具有以下優點:
WPF 由于其大小和復雜性,需要一些時間來學習。用于編寫 WPF 應用程序的類型位于 System.Windows 命名空間和除 System.Windows.Forms 之外的所有子命名空間中。
Windows 窗體是一個富客戶端 API,在 2000 年隨 .NET Framework 的第一個版本一起提供。與 WPF 相比,Windows 窗體是一種相對簡單的技術,它提供了編寫典型 Windows 應用程序所需的大多數功能。它在維護舊版應用程序方面也具有重要意義。但與 WPF 相比,它有許多缺點,其中大部分源于它是 GDI+ 和 Win32 控件庫的包裝器:
最后一點是偏愛 WPF 而不是 Windows 窗體的一個很好的理由,即使您編寫的業務應用程序只需要 UI 而不是“用戶體驗”。WPF 中的布局元素(如 Grid)使組合標簽和文本框變得容易,以便它們始終對齊(即使在語言更改本地化之后),而不會產生混亂的邏輯和閃爍。此外,您不需要屈服于屏幕分辨率的最低公分母 - WPF 布局元素從一開始就設計為能夠正確適應調整大小。
從積極的方面來看,Windows 窗體相對容易學習,并且仍然具有大量的第三方控件。
Windows 窗體類型位于 System.Windows.Forms(在 .dll 中)和 System.Drawing(在 中)命名空間中。后者還包含用于繪制自定義控件的 GDI+ 類型。
UWP 是一個富客戶端 API,用于編寫面向 Windows 10+ 桌面和設備的觸摸優先 UI。“通用”一詞是指它在一系列Windows 10設備上運行的能力,包括Xbox,Surface Hub和HoloLens。但是,它與早期版本的Windows不兼容,包括Windows 7和Windows 8 / 8.1。
UWP API 使用 XAML,有點類似于 WPF。以下是它的主要區別:
由于這些差異造成的限制,UWP 從未成功地匹配 WPF 和 Windows 窗體的流行程度。為了解決這個問題,Microsoft引入了一項新技術來取代UWP,稱為Windows App SDK(具有一個名為WinUI 3的UI層)。
Windows 應用 SDK 將 WinRT API 從操作系統傳輸到運行時,從而公開完全托管的界面,并且無需以特定操作系統版本范圍為目標。它還:
但是,在撰寫本文時,Windows App SDK不支持Xbox或HoloLens。
MAUI(2022 年初)是 Xamarin 的新化身,可讓您使用 C# 開發面向 iOS 和 Android 的移動應用程序(以及面向 macOS 和 Windows 的跨平臺桌面應用程序)。
在iOS和Android上運行的CLR / BCL稱為Mono(開源Mono運行時的派生版本)。從歷史上看,Mono 并不完全兼容 .NET,在 Mono 和 .NET 上運行的庫將面向 .NET Standard。在MAUI中,Mono的公共接口與.NET 6合并,使Mono實際上成為.NET 6的。
MAUI 新增功能包括統一的項目界面、熱重載、對 Blazor 桌面和混合應用的支持,以及改進的性能和啟動時間。有關詳細信息,請參閱 。
在WIN10系統中,有時安裝AUTOCAD 3DMAX等一些設計軟件時,會提示缺少NET3.5組件,沒法安裝,在win10中安裝.NET Framework 3.5不成功,大部分都是因為錯誤87
解決辦法:
1.下載 NET Framework 3.5的安裝包:百度下載或者原版WIN10安裝包里提取文件NetFx3.cab,將下載下來的.cab 放進 C:\Windows 目錄下
2.打開控制面板->程序->啟動或關閉Windows功能->關閉其他.NET Framework服務,之后 右擊開始 -> 點擊命令提示符(管理員)
3.輸入 dism /online /Enable-Feature /all /FeatureName:NetFx3 /Source:"%windir%" /LimitAccess回車
4.稍等幾分后,進度百度比變成100%時,就是安裝成功了!之后再開啟其他.NET Framework服務
5.啟動電腦后,再安裝CAD 3DMAX等軟件,看看是不是沒有錯誤提示了,一下就安裝成功了呢.
如果本經驗方法對你們有幫忙的話,請收藏并關注我下哦:原創之家零零柒