.NET6 平台系列2 .NET Framework框架详解
- 2021 年 4 月 25 日
- 筆記
- .NET Framework, .NET、.NET Framework
.NET Framework 是 Windows 的托管执行环境,可为其运行的应用提供各种服务。 它包括两个主要组件:公共语言运行时 (CLR),它是处理运行应用的执行引擎;.NET Framework 类库,它提供开发人员可从其自己的应用中调用的已测试、可重用代码库。 .NET Framework 提供的用于运行应用的服务包括:
-
内存管理。 在许多编程语言中,程序员负责分配和释放内存并处理对象生存期。 在 .NET Framework 应用中,CLR 代表应用提供这些服务。
-
常规类型系统。 在传统编程语言中,基本类型由编译器定义,这将使跨语言互操作性复杂化。 在 .NET Framework 中,基本类型由 .NET Framework 类型系统定义,并且是面向 .NET Framework 的所有语言所共有的。
-
一个全面的类库。 处理常见的低级编程操作时,程序员可通过 .NET Framework 类库使用类型及其成员的易访问库,而不必编写大量代码。
-
开发框架和技术。 .NET Framework 包括用于特定区域应用开发的库,例如用于 Web 应用的 ASP.NET、用于数据访问的 ADO.NET、用于面向服务的应用的 Windows Communication Foundation,以及用于 Windows 桌面应用的 Windows Presentation Foundation。
-
语言互操作性。 面向 .NET Framework 的语言编译器发出名为公共中间语言 (CIL) 的中间代码,反过来,通过公共语言运行时在运行时进行编译。 借助此功能,使用某种语言编写的例程可由另一种语言访问,程序员可以专注于使用其首选语言创建应用。
-
版本兼容性。 除少数例外,使用特定版本的 .NET Framework 开发的应用无需在更高版本中修改即可运行。
-
并行执行。 通过允许同一台计算机上存在公共语言运行时的多个版本,.NET Framework 可帮助解决版本冲突。 这意味着应用的多个版本可以共存,并且应用可在构建它的 .NET Framework 版本上运行。 并行执行适用于 .NET Framework 版本组 1.0/1.1、2.0/3.0/3.5 和 4/4.5.x/4.6.x/4.7.x/4.8。
-
多定向。 通过面向 .NET Standard,开发人员可创建适用于该标准版本支持的多种 .NET Framework 平台的类库。 例如,面向 .NET Framework 4.6.1、NET Core 2.0 和 UWP 10.0.16299 的应用可以使用面向 .NET Standard 2.0 的库。
.NET Framework 是一种技术,支持生成和运行 Windows 应用及 Web 服务。 NET Framework 旨在实现下列目标:
-
提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Web 上分布,或者是在远程执行。
-
提供可执行以下操作的代码执行环境:
-
将软件部署和版本控制冲突最小化。
-
提高代码(包括由未知的或不完全受信任的第三方创建的代码)执行安全性。
-
消除脚本环境或解释环境的性能问题。
-
- `使开发人员的经验在面对类型大不相同的应用(如基于 Windows 的应用和基于 Web 的应用)时保持一致。
- 按照工业标准生成所有通信,确保基于 .NET Framework 的代码可与任何其他代码集成。
.NET Framework 是运行在 Windows 系列操作系统上的一个系统应用程序。它是 .NET 的核心部分,提供了建立和运行 .NET 应用程序所需要的编辑、 编译等核心服务。它包括2个重要组成部分:公共语言运行时 (Common Language Runtime,CLR) 和 .NET Framework 类库(Framework Class Library,FCL)。下图显示公共语言运行时和类库与应用之间以及与整个系统之间的关系。 该图还显示托管代码如何在更大的结构内运行。
.NET Framework = CLR + FCL
下图展示了 .NET Framework 框架更加详细的组成与层次结构
.NET Framework = CLR + BCL + Application Model
· OS
操作系统。
.NET Framework 从设计之初就是以微软自家的 Windows 系统为基础,提供的API与Windows系统底层接口紧密关联。所以 .NET Framework 只能运行在 Windows Server 与 Windows PC上。
· CTS
CLR 一切围绕类型展开。类型向应用程序和其他类型公开了功能。通过类型,用一种编程语言写的代码能与另一种语言写的代码沟通。由于类型是 CLR 的根本,所以微软制定了一个正式的规范来描述类型的定义和行为,这就是“通用类型系统”(Common Type System,CTS)。
CTS 提供了2种类型:引用类型、值类型。
- CTS 规范规定,一个类型可以包含零个或多个成员。这些成员包括:字段(Field)、属性(Property)、方法(Method)、事件(Event)。
- CTS 指定了类型可见性规则以及类型成员的访问规则。private、public 等。
- CTS 还为类型继承、虚方法、对象生存期等定义了相应的规则。
- CTS 规定:所有类型最终必须从预定义的 System.Object 类型继承。
为了实现语言的互操作性,.NET Framework 采用以下的两种方法来解决语言的划分问题。
(1)标准化数据类型。建立通用语言运行环境中的通用类型系统(CTS),它为最常用的数据类型(如整数、实数、文本字符等)定义了标准的内部描述和运算,并提供了将这些类型向所有的.NET语言和CLR扩展的机制。 这种机制能够表示大多数现代编程语言的语法,消除了每种语言自己唯一且不兼容的方法。CTS是一套CLR中的数据类型都必须遵守的规则。如果某种语言在创建数据类型时遵守了CTS,则它创建和存储的数据将能够与其他也遵守了CTS的编程语言兼容。
(2)标准化应用程序格式。.NET 拥有自己的微软中间语言(MSIL)、元数据和清单的汇编。所有的.NET语言的编译器都生成这种格式。即通过从元数据中提取有关的MSIL的信息,编译器、调试器、协调器等工具都可以分析处理任何一种源程序设计的数据。
· CLS
各种编程语言之间除了类型不同,其他方面也存在着极大的区别。例如有的语言不区分大小写,有的不支持 unsigned(无符号)整数、操作符重载或者参数数量可变的方法。要创建很容易从其他编程语言中访问的类型,只能从自己的语言中挑选其他所有语言都支持的功能。因此微软定义了“公共语言规范”(Common Language Specifition,CLS)。
CLS 详细定义了一个最小功能集(CTS 的一个子集)。任何编译器只有支持这个功能集,生成的类型才能兼容其他符合 CLS、面向 CLR 语言生成的组件。
· CLR
公共语言运行时。
公共语言运行时是 .NET Framework 的基础。 CLR 本质上就是.NET 虚拟机。 可将运行时看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。 事实上,代码管理的概念是运行时的基本原则。 以运行时为目标的代码称为托管代码,而不以运行时为目标的代码称为非托管代码。
公共语言运行时管理内存、线程执行、代码执行、代码安全验证、异常处理、编译、垃圾回收以及其他系统服务。 这些功能是在公共语言运行时上运行的托管代码所固有的。
至于安全性,取决于包括托管组件的来源(如 Internet、企业网络或本地计算机)在内的一些因素,托管组件被赋予不同程度的信任。 这意味着即使用在同一活动应用中,托管组件既可能能够执行文件访问操作、注册表访问操作或其他须小心使用的功能,也可能不能够执行这些功能。
运行时还通过实现称为常规类型系统 (CTS) 的严格类型验证和代码验证基础结构来加强代码可靠性。 CTS 确保所有托管代码都是可以自我描述的。 各种 Microsoft 编译器和第三方语言编译器都可生成符合 CTS 的托管代码。 这意味着托管代码可在严格实施类型保真和类型安全的同时使用其他托管类型和实例。
此外,运行时的托管环境还消除了许多常见的软件问题。 例如,运行时自动处理对象布局并管理对对象的引用,在不再使用它们时将它们释放。 这种自动内存管理解决了两个最常见的应用错误:内存泄漏和无效内存引用。
运行时还提高了开发人员的工作效率。例如,程序员用他们选择的开发语言编写应用,却仍能充分利用其他开发人员用其他语言编写的运行时、类库和组件。 任何选择以运行时为目标的编译器供应商都可以这样做。 以 .NET Framework 为目标的语言编译器使得用该语言编写的现有代码可以使用 .NET Framework 的功能,这大大减轻了现有应用的迁移过程的工作负担。
尽管运行时是为未来的软件设计的,但是它也支持现在和以前的软件。 托管和非托管代码之间的互操作性使开发人员能够继续使用所需的 COM 组件和 DLL。
运行时旨在增强性能。 尽管公共语言运行时提供许多标准运行时服务,但是它从不解释托管代码。 一种称为实时 (JIT) 编译的功能使所有托管代码能够以它在其上执行的系统的本机语言运行。 同时,内存管理器排除了出现零碎内存的可能性,并增大了内存引用区域以进一步提高性能。
最后,运行时可由高性能的服务器端应用(如 Microsoft SQL Server 和 Internet Information Services (IIS))承载。 此基础结构使您在享受支持运行时承载的行业最佳企业服务器的优越性能的同时,能够使用托管代码编写业务逻辑。
· BCL
基类库。它是 FCL 的一个子集,它们为开发者提供了面向对象的特性所需的、和 CLR 紧密集成的一组可重用类的集合,并且此类库仅使用 CTS 数据类型和标准的应用程序格式编制,从而简化了应用开发过程和难度,而且很容易与第三方组件无缝集成,也能被使用任何一种 .NET 编程语言的应用程序所使用。CLI规范的一部分,定义了集合、线程处理、控制台以及用于生产几乎所有程序所需的其他基类。
它是一组构成 System.*(在一定的程度上构成 Microsoft.*)命名空间的库。 BCL 是用于生成 ASP.NET、ASP.NET Core 等较高级应用程序框架的较低级通用框架。
.NET 5(和 .NET Core)及更高版本的 BCL 的源代码包含在 .NET 运行时存储库中。 这些 BCL API 中的大多数也可以在 .NET Framework 中获取,因此可将此源代码视为 .NET Framework BCL 源代码的一个分支。
以下术语通常指 BCL 引用的相同 API 集合:
· 基本操作
构建于BCL之上,它是FCL的一部分,是FCL为开发人员提供的基础性操作(如:数据库操作、IO等)。
面向数据:ADO.NET、Entity Framework、Linq To SQL等。
面向服务:WCF、WF和 Data Services等。
· 框架模板
面向应用:开发框架 (BS/CS)、IT产品
· 语言
.NET Framework的核心是CLR。在CLR的控制下运行的代码称为托管代码,在CLR执行代码之前,需要编译,分为2个阶段:
(1)把源代码编译为Microsoft中间语言(MSIL)。
(2)CLR把MSIL编译为平台专用的机器代码。
.NET平台支持很多语言,常见的有 VB、C++、C#、F#、J#(Java)JScript等。无论使用哪种语言来编写源代码,都会通过编译器编译成MISL,从而转换成机器码,都能被机器识别。语言的集成性主要是公共语言规范(CLS)和通用类型系统(CTS)一起确保了语言的相互操作性。CLS是一个最低标准集,所有面向.NET的编译器都必须支持它,每个语言都符合这个规范,从而满足了语言的互相调用和互操作。
- 安装
同一台电脑上可以同时安装多个版本的 .NET Framework 版本。
同一个版本的 .NET Framework 支持的Windows 版本不同。
支持的 Windows 版本
- Windows 10 和 Windows Server 2016
- Windows 8.1 和 Windows Server 2012 R2
- Windows 8 和 Windows Server 2012
- Windows 7 和 Windows Server 2008 R2
- Windows Vista 和 Windows Server 2008
不受支持的 Windows 版本
技术栈
1、.NET:C#、.NET5、.NET6、.NET Core、MVC、ASP.NET Core、Web API、RESTful API
2、jQuery、Vue.js、Bootstrap
3、数据库:SQLServer、MySQL、PostgreSQL、Oracle、SQLite、SequoiaDB 、
Redis、MongoDB、ElasticSearch、TiDB
4、ORM:Dapper、Entity Framework、FreeSql、SqlSugar、分库分表
5、架构:领域驱动设计 DDD、ABP
6、环境:跨平台、Linux、Windows、MaxOS、IIS、Nginx
7、移动App:Android、IOS、HarmonyOS、微信、小程序、快应用、
Xamarin、uni-app、MUI、Flutter、Framework7、Cordova、Ionic、React Native、Taro、NutUI、
mpvue、Smobiler
其他:
- 云原生、CI/CD、DevOps、微服务、Docker、K8S
- Dapr、RabbitMQ、Kafka、分布式、大数据、高并发、负载均衡、中间件
- RPC、ELK
- .NET + Docker + jenkins + Github + Harbor + K8S
- Python、Go