目录
1.什么是.Net平台、.NET框架
2..NET版本
3.CLR(公共语言运行时)
4.BCL(基础类库)
5.FCL(框架类库)
3..NET的运行机制
6.为什么说.NET是平台无关的
7.术语
参考:
“平台”(这里指软件技术平台,下面都指的是这个)就是能够独立运行并自主存在,为其所支撑的上层系统和应用提供运行所依赖的环境。提取一下就是,平台是一个环境。只要符合平台规范的应用都能扔到上面来运行。
.Net 包含两部分 .Net平台 和.Net FrameWork 框架
1、.Net FrameWork框架包含于.Net平台. .Net FrameWork提供环境和支撑保证.Net平台运行。
2、.Net FrameWork框架是.Net平台不可缺少的一部分,它提供了一个稳定的运行环境里来保证我们基于.Net平台开发的各种应用能够正常的运转。(.Net平台类似于可上网、通信、游戏的中国移动互联网平台,而.Net FrameWork框架类似保证中国移动互联网平台能够正常运转对的信号塔。)
3、C#是编程语言,可以基于.net平台的引用 。而java既是一种语言又是开发平台
4、.Net的开发应用: Winform(桌面应用程序)、ASP.NET(Internet应用程序)、WP8(手机开发)、Unity3D(游戏开发或虚拟现实)
5、两种交互模式 :C/S(客户机(Client)/服务器模式(Server)、B/S(浏览器(Browser)/服务器模式(Server))
6.NET框架是以一种采用系统虚拟机(即CLR)运行的,面向CLR的编程平台,以CLR为基础。
7.NET的基础类库运行于CLR之上(类比Java的虚拟机),作为其他各种功能的基石。
8.NET框架支持多种语言(C#、F#、VB.NET、C++、Python等)的开发。
C#版本 | .NET版本 | 发布日期 | 特性 |
---|---|---|---|
C# 1.0 | .NET Framework 1.0 | 2002-02-13 | 委托、事件 |
C# 1.1 | .NET Framework 1.1 | 2003-04-24 | APM(异步编程模型) |
C# 2.0 | .NET Framework 2.0 | 2005-11-07 | 泛型、匿名方法、迭代器、可空类型 |
C# 3.0 | .NET Framework 3.0 | 2007-11-06 | 隐式类型 |
.NET Framework 3.5 | 2007-11-19 | 对象集合初始化、自动实现属性、匿名类型、扩展方法、查询表达式、Lambda表达式、 表达式树、分部类和方法、Linq | |
C# 4.0 | .NET Framework 4.0 | 2010-04-12 | 动态绑定、命名和可选参数、泛型的协变和逆变、互操作性 |
C# 5.0 | .NET Framework 4.5 | 2012-08-15 | 异步和等待(async和await)、调用方信息(Caller Information) |
C# 6.0 | .NET Framework 4.6 | 2015-07-20 | C# 6 中的新增功能 |
.NET Core 1.0 | 2016-06-27 | ||
C# 7.0 | .NET Framework 4.6.2 | 2016-08-02 | C# 7.0 中的新增功能 |
C# 7.1 | .NET Framework 4.7 | 2017-04-05 | |
.NET Core 2.0 | 2016-08-14 | .NET Core 2.0 的新增功能 | |
C# 7.2 | .NET Framework 4.7.1 | 2017-10-17 | |
C# 7.3 | .NET Framework 4.7.2 | 2018-04-30 | |
.NET Core 2.1 | 2018-05-30 | .NET Core 2.1 的新增功能 | |
.NET Core 2.2 | 2018-12-04 | .NET Core 2.2 的新增功能 | |
C# 8.0 | .NET Framework 4.8 | 2019-04-18 | C# 8.0 中的新增功能 |
.NET Core 3.0 | 2019-09-23 | .NET Core 3.0 的新增功能 | |
.NET Core 3.1 | 2019-12-03 | .NET Core 3.1 的新增功能 |
.NET框架是开源的。它的代码在.NET Foundation - GitHub。
CLR是让程序执行所需的外部服务的集合,类似Java需要JVM虚拟机才可以运行。它的核心功能(比如即时编译,内存管理,程序集加载,安全性,异常处理和线程同步)可由面向CLR的所有语言使用。
CLR是.NET的运行基础,管理.NET程序集的执行。它运行于Windows之上,很多功能仅仅是Windows上的一个wrapper,例如线程,内存管理等,这些实际上是Windows在管理。但JIT则是它独有的,如果没有它,就不能把IL变成机器码,计算机也就不认识C#,你也就不能运行C#程序。
.NET下程序的运行
在开始运行.NET程序之前,编译器将代码转换为IL。
IL代码并不能直接运行,CLR将真正需要用到的程序集导入内存,读取元数据,接着为类型开辟内存空间,执行所有需要的安全检查,并最终运行代码:
CLR找到代码中拥有Main方法的类型并且加载这个类型。CLR中一个名为Class loader(类加载程序)的组件负责这项工作。它会从GAC、配置文件、程序集元数据中寻找这个类型,然后将它的类型信息加载到内存中的数据结构中。在Class loader找到并加载完这个类型之后,它的类型信息会被缓存起来,这样就无需再次进行相同的过程。当然,如果这个类型引用了其他的类型,则会导致一连串的程序集加载,这将定义程序代码执行的环境(类似Java的JVM)。注意即使工程很大,有几百个程序集,CLR不会全部加载,只会在真正用到该程序集的时候才加载。
验证。在CLR中,还存在一个验证程序(verifier),该验证程序的工作是在运行时确保代码是类型安全的。它主要校验两个方面,一个是元数据是正确的,一个是IL代码必须是类型安全的,类型的签名必须正确。这是早期绑定验证,验证在运行时之前发生。对于动态类型,此时不做任何检查。
即时编译。(此时就从编译时过渡到了运行时)这一步就是将托管的IL代码编译为可以执行的机器代码的过程,由CLR的即时编译器(JIT Complier)完成。即时编译只有在方法的第一次调用时发生。类型加载程序(Class loader)会为每个方法插入一个存根。在调用方法时,CLR会检查方法的存根,如果存根为空,则执行JIT编译过程,并将该方法被编译后的本地机器代码地址写入到方法存根中。当第二次对同一方法进行调用时,会再次检查这个存根,如果发现其保存了本地机器代码的地址,则直接跳转到本地机器代码进行执行,无需再次进行JIT编译。JIT编译还会优化本地的代码。
在程序运行时,CLR还负责:
异常处理
内存管理与垃圾回收
线程管理(线程池)
托管代码是必须在CLR下执行的代码,而非托管代码则不需要CLR的支持就可以运行。CLR本身用于管理托管代码,因此它是由非托管代码编写的,并不是一个包含了托管代码的程序集,也不能使用IL DASM进行查看。
Base Class Library (BCL) 是微软所提出的一组标准库,可提供给.NET Framework所有语言使用。随着 Windows 以及.NET Framework 的成长,BCL 已近乎成为在.NET上的 Windows API。mscorlib.dll程序集几乎就是基础类库的代名词。基础类库中定义的类型称为基元类型,它也是为.NET框架所有的语言共享。
当安装.NET Framework时,所有的基础类库被部署到全局程序集缓存(GAC)。它的位置一般在C:\Windows\assembly。所以你不需要在你的工程中手动引用任何的基础类库,它们会被自动引用。
如果你从GAC中删除了mscorlib.dll,你的IDE将变成一个什么都不懂的白痴。因为没有mscorlib.dll,意味着没有基础类库,没有整型,字符串,控制台…你什么都做不了。
作为一名.NET程序员,每天都要打交道的就是FCL了(框架类库)。BCL是FCL的一个子集。简单来说FCL除了BCL的那部分,就是我们要引用的外部参考。
所有.NET支持的语言编写出来的程序,在支持.NET的编译器编译之后,会先产出程序集,其主要内容是IL和元数据。之后,CLR调用JIT再将其翻译为机器码。
(1).NET程序被编译成什么形式的代码
.net程序在第一次编译后,形成CLR头,元数据和中间代码。
在实时运行或者部署时,进行第二次变异,编译的结果是在CLR中可以执行的机器代码;
-CLR头包含了.net在运行该程序时得到的信息,包括程序集版本号,文件名和模块版本号。
-MetaData包含了所有类型的定义,所有的引用以及程序集清单。
(2) JIT是如何工作的
JIT引擎在编译中间代码之前,会寻找本机机器代码缓存并且确认是否可用:
- 如果可以用,则直接加载;
- 如果不可用,JIT引擎会查找类型中的方法存根,找到中间代码并且进行编译。
(3)简述程序集的加载机制
CLR通过System.Reflection.Assembly.LoadFrom和System.Reflection.Assembly.Load来主动加载程序集:
- 前者通过位置加载程序集;
- 后者通过 唯一标识 强命名程序集 的四个元素来标识程序集;
它们的加载方式一致,其内在策略是依次通过版本策略,CODEBASE位置,应用程序域位置和程序位置来查找程序(4)(4)什么是IL(CIL)?
在.NET的开发过程中, IL的官方术语是MSIL或CIL(Common Intermediate Language,即公共中间语言)。因此,IL,MSIL 和CIL指的是同一种东西。
当使用支持.NET的编译器编译之后,生成.dll或.exe文件。这文件称作.NET程序集,包含IL和元数据。不同语言(例如C#和 VB)经过不同编译器(例如C#编译器和VB编译器),编译一段功能相似的代码(区别仅仅在于语法),其IL也基本相似。虽然IL相对C#较为底层,但它仍然是一个十分高级的语言。它并不是汇编语言。
(5)什么是JIT?还有什么其他编译方式?何时使用到JIT?
即时编译(英语:Just-in-time compilation)是动态编译的一种形式,是一种提高程序运行效率的方法。通常,程序有两种运行方式:静态编译与动态编译。静态编译的程序在执行前全部被翻译为机器码,而动态编译执行的则是一句句,边运行边翻译。
即时编译则混合了这二者,一句句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗。相对于静态编译代码,即时编译的代码可以处理延迟绑定并增强安全性。
CLR的JIT负责将IL编译成机器码。 当程序编译成程序集之后,CLR加载任何需要用到的其他程序集,并开始使用JIT将CIL编译为机器码。
JIT编译器会在方法的首次调用时,从类型的元数据中查找方法,并进行检查,例如检查类型是否安全。如果出现了问题,则触发运行时错误。以后对方法的所有调用都以本地代码的形式全速运行,无须重新检查。
.NET程序集可以在非微软操作系统如Mac OS,各种版本的Linux,以及iOS和Android移动设备上开发和执行。
.NET的平台无关性主要体现为:.NET程序集可以在任何的平台上运行,不管是Windows,还是Mac,只要这个平台拥有将IL转换为机器码,以及加载其他相关程序集的能力(即CLR),而任何机器都可以运行机器码。
这类似于Java的虚拟机,只要平台装了Java虚拟机,则这个平台就可以运行Java程序。
1.CLR(公共语言运行时):类似java中jvm虚拟机,对.net很重要
2.BCL(基础类库)
3.FCL(框架类库)
4.CTS(公共类型系统)
5.CLS(公共语言规范)
https://www.cnblogs.com/makesense/p/6238160.html
https://www.cnblogs.com/makesense/p/6238160.html
https://www.cnblogs.com/joean/p/4716568.html
https://www.cnblogs.com/cuozhixu/p/5968920.html