C#是一种简单、现代、面向对象和类型安全的编程语言。。
.NET是由Microsoft创建的开发平台,平台包含了语言规范、工具、运行,支持开发各种应用,如Web、移动、桌面等。.NET框架有多个实现,如.NETFramework、.NETCore(及后续的.NET5+版本),以及社区版本Mono。除此以外,C#.NET体系还有很多概念,本文就来简单了解下C#、.NETFramework、CLR、.NETCore、CTS、JIT等概念。
.NETFramework(1.0——4.8.1):.NETFramework是基于Windows系统的.NET框架,从2002年发布,到最新的4.8.*版本,已经停止发展。
.NETCore(Core1/2/3,5/6/7/8/9):从2016年发布首个.NETCore1,和后面的.NETCore2/3、.NET5/6/7/*是一个体系的,只是从.NET5开始更改了命名。这是微软推出的新一代.NET框架,用来代替原有的.NETFramework,核心特点就是开源、跨平台,这也是.NET未来重点发展、投资的地方。
.NETFramework是运行在Windows系列操作系统上的一个系统应用程序。它是.NET的核心部分,提供了建立和运行.NET应用程序所需要的编辑、编译等核心服务。它包括2个重要组成部分:公共语言运行时(CommonLanguageRuntime,CLR)和.NETFramework类库(FrameworkClassLibrary,FCL)。
对于Framework:
为了解决跨平台的问题,早期是社区开源的Mono,后来就是Mono被微软收购后,统一实现并开源了全新的.NETCore框架。不过两者很多技术、概念是一样的。
公共语言运行时(CommonLanguageRuntime,CLR),CLR本质上就是.NET虚拟机(类似Java的虚拟机JVM),算是.NET的引擎,用来执行托管.NET代码,确切的说是编译后的IL代码。提供管理内存、线程执行、代码执行、代码安全验证、异常处理、编译、垃圾回收等运行时服务。
CLR是.NET的核心,当我们学习了基本C#语法后,想要进一步进阶,就必须了解CLR的机制了。
.NETCLR是支持多种语言的,如C#、F#、VB等,这些语言编译后都可以在CLR上执行,还支持不同语言的互操作,比如在C#类继承一个VB写的类,在C#中调用F#写的一个方法等。
实现这种不同语言之间交互的基础就是这些语言都遵循统一的规范和要求——CTS(通用类型系统),CTS定义了一套通用的数据类型系统,包括值类型、引用类型的结构。比如C#中int、VB中的Interger都是整形,对应CTS中的Int32。
CLS是CTS的子集,规定了语言编译器必须遵循的一组规则,以便创建在CLR中运行的.NET应用程序。可以把CTS看做是规范,CLR是对CTS的具体实现。
类库(FrameworkClassLibrary,FCL)就是.NETFramework内置的各种组件服务,如ASP.NET、MVC、WCF和WPF等组件,满足不同编程应用场景的需求。
基础类库BCL(BaseClassLibrary)是FCL的一个子集,顾名思义就是一些比较基础、通用的类库,如基本数据类型、集合、线程、安全、字符串操作、网络操作、IO、XML操作等等,大多都包含在System命名空间下,如System.Text、System.IO。其他一些常用的名词,如核心.NET库、框架库、运行时库、共享框架,大多都指的是BCL。
BCL作为FCL的基础,使用了CTS数据类型和标准的应用程序格式编制,能被任何一种.NET编程语言的应用程序所使用。
.NET是为了支持多种语言而设计的,如Microsoft自己发布的VB.NET、ManagedC++、C#、J#和JScript.NET,还有其他厂商开发的语言,如Cobol、Smalltalk、Perl和Eiffel等几十种编程语言。
无论使用哪种语言来编写源代码,都会通过编译器编译成中间代码MSIL(MicrosoftIntermediateLanguage)。语言的集成性主要是公共语言规范(CLS)和通用类型系统(CTS)一起确保了语言的相互操作性。CLS是一个最低标准集,所有面向.NET的编译器都必须支持它,每个语言都符合这个规范,从而满足了语言的互相调用和互操作。
.NET语言程序运行的逻辑如下图:
每种语言都有自己的编译器,将源代码编译成中间语言(MSIL,或IL),然后在CLR上运行,主要分为两个阶段:
Microsoft中间语言(MSIL),也称为通用中间语言(CIL/IL:CommonIntermediateLanguage),是一组与平台无关的指令,在CLR中运行时由JIT按需编译为机器码执行。
.NETCore是一个免费、跨平台、开源的开发平台,用于一站式构建不同类型的应用程序。.NETCore是以.NETFramework为基础,但是经过重新设计、实现的的新一代框架,实现了原.NETFramework中的几乎所有功能,核心特点就是开源、跨平台。
.NETCore从2016年发布首个.NETCore1,后面陆续发布了.NETCore2、.NETCore3,及后续的.NET6、.NET7、.NET8、.NET9。
.NET框架体系经过多年发展,衍生了多个版本——使用.NETFramework来构建Windows桌面应用程序,使用Xamarin来构建iOS或Android应用程序,使用.NETCore来构建跨平台的Web应用程序。每一个框架都有自己的BCL、运行时CLR,长此以往,这也是造成如今.NET市场越来越差的原因之一。
so,为解决这个问题,.NETCore就肩负了这个一统江湖的使命!
从.NET5,到.NET7,统一的愿景基本已达成,一站式构建Web、桌面和移动等应用,支持传统的WPF、Winfrom(当然这两者只限于Windows系统),还引入了.NETMulti-platformAppUI(.NETMAUI)作为XamarinForms的继任者。
CoreCLR是一个跨平台的运行时,移植了.NETFramework的CLR的功能,包含核心程序库mscorlib、JIT编译器、垃圾收集器(GC)以及其他运行MSIL所需要的运行期环境。
不同于CoreCLR,CoreRT不是虚拟机,也没有生成和动态运行代码的能力,因为它不包括JIT。它具有RTTI(运行时类型标识)和反射的能力,同时还具备垃圾回收(GarbageCollector)功能。CoreRT会在不同的平台使用不同的AOT技术:
参考原文:
.NETFramework中有一些技术在.NET中已经废弃或调整了:
更多请参考:
为了保障兼容性,.NetCore依然是可以调用.NETFramework的库,只是如有有不支持的API或依赖会抛出异常。
开发服务端后台服务肯定是首选.NETCore的,那传统的的Windows桌面程序(WinForm、WPF)呢?能不能用最新的.NETCore呢?——答案当然是可以的!
优点:
缺点:
尽管.NETCore是跨平台的,但其WPF、Wiform仅在Windows上运行!
不要升级VisualBasicWindows窗体项目。扩展似乎存在bug!
托管代码(ManagedCode)是指在受管理环境中运行的代码,通常指的是.NET语言(C#、VB)开发的代码,在CLR运行时环境中运行。由CLR来负责内存管理、垃圾回收、类型安全性和异常处理等任务,所以我们写(C#)托管代码时,就可以随意申明变量、创建对象,而不用去管内存的分配、管理和回收,使得代码更容易编写、维护和调试。
Java也算一种托管代码
相对而言,非托管代码(UnmanagedCode)就是没有专门的执行管理环境,通常使用低级编程语言(如C、C++)编写,开发人员需要手动处理内存管理、异常和资源释放等问题。
在实际的C#的开发中,我们也会经常用到非托管资源,如IO、文件流操作,就需要注意要手动释放(非托管)资源,避免内存溢出。
所以:
ECMA(EuropeanComputerManufacturersAssociation,欧洲计算机制造商协会)是一个国际性的标准化组织,致力于制定和推广信息和通信技术的标准。
CLI(CommonLanguageInfrastructure)公共语言基础结构:是一系列规范标准的总称,包括CTS、CLS、CIL、元数据、执行系统等多种规范,.NET、Mono就是他的实现,由国际标准组织ECMA维护。
学习C#、CLR不需要去看上述规范,这个不适合,如果你是要自己实现一门高级语言,或写一个C#编译器则可以去看看。
Mono就像流落民间的王子,靠着乡亲们的力量慢慢成长,最后被国王召回,继承大统。
Mono基于C#的ECMA标准和公共语言运行时(CLR),包括Mono运行时、C#编译器、类库和一些附加工具。Mono兼容.NET标准,并支持跨平台开发。可以在多个操作系统上运行,包括Linux、macOS和Windows。Mono比较流行的应用场景就是Unity游戏开发和移动端应用开发。