梳理下.NET Framework,看看.NET Framework是什么样的一个运行环境,怎么和Windows系统打交道。
一、.NET Framework的用途是什么?
.NET Framework用于在Windows上运行.NET应用程序,满足.NET Framework规范的应用都可以在Windows操作系统上运行。
二、为什么需要.NET Framework?
您需要安装.NET Framework才能在使用.NET Framework创建的Windows操作系统上运行应用程序。
三、.NET Framework如何工作?
.NET Framework应用程序用C#,F#或Visual Basic编写,并通过编译器编译为通用中间语言(CIL),公共语言运行库(CLR)在给定的计算机上运行.NET应用程序,将CIL转换为计算机代码。
四、.NET Framework的主要组件/功能是什么?
上面的插图显示公共语言运行时和类库与应用之间以及与整个系统之间的关系。 该插图还显示托管代码如何在更大的结构内运行。 以CLR为目标的代码称为托管代码,而不以CLR为目标的代码称为非托管代码。
1、.NET Framework 包括公共语言运行时 (CLR) 和 .NET Framework 类库。
(1)公共语言运行时是 .NET Framework 的基础, 可将CLR看作一个在执行时管理代码的代理,公共语言运行时管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务,这些功能是在公共语言运行时上运行的托管代码所固有的。
至于安全性,取决于包括托管组件的来源(如 Internet、企业网络或本地计算机)在内的一些因素,托管组件被赋予不同程度的信任。 这意味着即使用在同一活动应用中,托管组件既可能能够执行文件访问操作、注册表访问操作或其他须小心使用的功能,也可能不能够执行这些功能。
运行时还通过CTS来加强代码可靠性。CTS是用于解决不同语言的数据类型不同的问题 ,CTS 确保所有托管代码都是可以自我描述的,比如C#和VB.NET都是公共语言运行时的托管代码,它们的语法和数据类型各不相同,如C#中的整型是int,而VB.NET中是Integer,通过CTS我们把它们两个编译成通用的类型Int32。 各种 Microsoft 编译器和第三方语言编译器都可生成符合 CTS 的托管代码, 这意味着托管代码可在严格实施类型保真和类型安全的同时使用其他托管类型和实例。
此外,运行时的托管环境还消除了许多常见的软件问题。 例如,运行时自动处理对象布局并管理对对象的引用,在不再使用它们时将它们释放, 这种自动内存管理解决了两个最常见的应用错误:内存泄漏和无效内存引用。
运行时还提高了开发人员的工作效率。 例如程序员用他们选择的开发语言编写应用,却仍能充分利用其他开发人员用其他语言编写的运行时、类库和组件。 任何选择以运行时为目标的编译器供应商都可以这样做。 以 .NET Framework 为目标的语言编译器使得用该语言编写的现有代码可以使用 .NET Framework 的功能,这大大减轻了现有应用的迁移过程的工作负担。
尽管运行时是为未来的软件设计的,但是它也支持现在和以前的软件。 托管和非托管代码之间的互操作性使开发人员能够继续使用所需的 COM 组件和 DLL。
运行时旨在增强性能。 尽管公共语言运行时提供许多标准运行时服务,但是它从不解释托管代码。即时 (JIT) 编译的功能使所有托管代码能够以本机语言运行。 同时内存管理器排除了出现零碎内存的可能性,并增大了内存引用区域来进一步提高性能。
最后,运行时可由高性能的服务器端应用(如 Microsoft SQL Server 和 Internet Information Services (IIS))承载。
(2)类库是一个综合性的面向对象的可重用类型集合,可使用它来开发多种应用,这些应用包括传统的命令行或图形用户界面 (GUI) 应用,还包括基于 ASP.NET 提供的最新创新的应用(如 Web Forms 和 XML Web service)。
2、.NET Framework 可由非托管组件承载,这些组件将CLR加载到它们的进程中并启动托管代码的执行,从而创建一个同时利用托管和非托管功能的软件环境。 .NET Framework 不但提供若干个运行时主机,而且还支持第三方运行时主机的开发。例如,ASP.NET 承载运行时为托管代码提供可伸缩的服务器端环境, ASP.NET 直接使用运行时以启用 ASP.NET 应用和 XML Web service。Internet Explorer 是承载运行时(以 MIME 类型扩展的形式)的非托管应用的一个示例,使用 Internet Explorer 承载运行时使您能够在 HTML 文档中嵌入托管组件或 Windows 窗体控件, 以这种方式承载运行时使托管移动代码成为可能,不过它需要进行时只有托管代码才能提供的重大改进(如不完全受信任的执行和独立的文件存储)。
五、.NET Framework中包含的名词及作用
1、CLR(Common Language Runtime,公共语言运行库)
上边有详细的介绍,CLR也可以看作一个在执行时管理代码的代理,管理代码是CLR的基本原则,能够被管理的代码成为托管代码,反之称为非托管代码。CLR包含两个组成部分,CLS(公共语言规范)和CTS(通用类型系统)。
2、CTS(Common Type System,通用类型系统)
C#和VB.NET都是公共语言运行时的托管代码,它们的语法和数据类型各不相同,CLR是如何对这两种不同的语言进行托管的呢?CTS可用于解决不同语言的数据类型不同的问题,如C#中的整型是int,而VB.NET中是Integer,通过CTS我们把它们两个编译成通用的类型Int32。所有的.NET语言共享这一类型系统,在它们之间实现无缝互操作。 3、CLS(Common Language Specification,公共语言规范)
3、GC(Garbage Collection,垃圾收集)
4、COM(Component Object Model,组件对象模型)
5、Managed code 托管代码
以CLR为目标的代码称为托管代码,怎么理解呢?能够被CLR管理的代码成为托管代码,反之称为非托管代码。举个例子:源代码(比如C#,VB,F#)在运行时被编译器编译为CIL,而CIL通过CLR转换为能被操作系统执行的机器码。所以说CIL也是一种托管代码。
编译器把代码编译成中间语言(CIL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,呈现形式一般为DLL/EXE,程序集中包含了描述你所创建的类,方法和属性(例如安全需求)的所有元数据。你可以拷贝这个程序集到另一台服务器上部署它。
托管代码在公共语言运行库(CLR)中运行。这个运行库给你的运行代码提供各种各样的服务,通常来说,他会加载和验证程序集,以此来保证中间语言的正确性。当某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机器码,然后会把编译好的机器码缓存起来,以备下次调用(这就是即时编译)。随着程序集的运行,运行库会持续地提供各种服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。
6、Unmanaged code 非托管代码
非托管代码就是在Visual Studio .NET 2002发布之前所创建的代码。例如Visual Basic 6, Visual C++ 6, 最糟糕的是,连那些依然残存在你的硬盘中、拥有超过15年历史的陈旧C编译器所产生的代码都是非托管代码。托管代码直接编译成目标计算机的机器码,这些代码只能运行在编译出它们的计算机上,或者是其它相同处理器或者几乎一样处理器的计算机上。非托管代码不能享受一些运行库所提供的服务,例如安全和内存管理等。如果非托管代码需要进行内存管理等服务,就必须显式地调用操作系统的接口,通常来说,它们会调用Windows SDK所提供的API来实现。就最近的情况来看,非托管程序会通过COM接口来获取操作系统服务。 跟Visual Studio平台的其他编程语言不一样,Visual C++可以创建非托管程序。当你创建一个项目,并且选择名字以M FC,ATL或者Win32开头的项目类型,那么这个项目所产生的就是非托管程序。
7、托管代码和非托管代码区别
(1)托管代码是一种中间语言,运行在CLR上; 非托管代码被编译为机器码,运行在机器上。
(2)托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;非托管代码依赖于平台和语言。
(3)托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作; 非托管代码需要自己提供安全检测、垃圾回收等操作。
六、您可以安装多个.NET Framework吗?
.NET Framework的某些版本是并行安装的,而其他版本将升级现有版本(称为就地更新)。当两个.NET Framework版本共享同一CLR版本时,将发生就地更新。例如,在安装了.NET Framework 4.7.2和3.5的计算机上安装.NET Framework 4.8,将对4.7.2进行就地更新,而将3.5单独安装。
.NET Framework版本 | CLR版本 |
---|---|
.NET Framework 4.x | 4.0 |
.NET Framework 2.x和3.x | 2.0 |
.NET Framework 1.1 | 1.1 |
.NET Framework 1.0 | 1.0 |