1. .NET Framework
是支持生成和运行下一代应用程序和 XML Web services 的内部 Windows 组件。.NET Framework 具有两个主要组件:公共语言运行库(Common Language Runtime)和 .NET Framework 类库(Framework Class Library)。
2. 公共语言运行库)(Common Language Runtime)
是 .NET Framework 的基础。可以将运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。以下是CLR提供的服务:
Ø 代码管理(加载和执行)
Ø 应用程序内存隔离
Ø 类型安全验证
Ø IL 到本机代码的转换
Ø 对元数据(增强型类型信息)的访问
Ø 托管对象内存的管理
Ø 代码访问安全性的强制
Ø 异常处理,包括语言间异常
Ø 托管代码、COM 对象和预先存在的 DLL(非托管代码和数据)间的相互操作
Ø 对象布局的自动化
Ø 对开发人员服务的支持(分析、调试等等)
3. .NET Framework 类库(Framework Class Library)
它是一个综合性的面向对象的可重用类型集合,可以使用它开发多种应用程序,这些应用程序包括传统的命令行或图形用户界面 (GUI) 应用程序,也包括基于 ASP.NET 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)。它可以完成以前要通过Windows API来完成的绝大多数任务。
4. 托管代码 (managed code)
由公共语言运行库环境(而不是直接由操作系统)执行的代码。托管代码应用程序可以获得公共语言运行库服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。托管代码有以下优点:
Ø 平台无关性。源代码先编译成中间语言,运行时由CLR将中间语言编译成平台专用的代码,跟Java的字节代码一样,这样即可实现平台无关性。
Ø 提高性能。首先,IL比Java的字节码作用还要大,因为IL是即时编译的,而Java的字节码常常是解释性的,在转换为平台可执行代码的时候可能会导致性能损失。其次,.NET的即时编译器(JIT)(Just In Time)并非一次把全部代码编译完才执行,而是只编译调用的那部分代码,并把得到的这部分内部可执行代码保存起来,下次需要调用的时候无须重新编译。Microsoft认为这个过程要比一开始编译整个应用程序代码的效率高得多,因为任何程序的大部分代码实际上并不是在每次运行过程中都执行。最后,传统的编译器会优化代码,但它们的优化过程是独立于代码所运行的特定处理器的。例如Visual Studio 6优化了一台一般的Pentium机器,它所生成的代码就不能利用Pentium Ш处理器的硬件特性。而JIT与平台无关,所以它可以针对不同的机器完成不同的优化。
Ø 语言的互操作性。互操作性即能将任何一种语言编译为中间代码,编译好的代码可以与从其它语言编译过来的代码进行交互操作。在.NET中可以交互操作的语言有C#、VB.NET、Visual C++.NET、Visual J#、脚本语言、COM和COM+。
5. 非托管代码(Unmanaged Code)
在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务;它与托管代码不同,后者从公共语言运行库中获得这些服务。
6. 中间语言(MSIL)
中间语言(MSIL)在.NET Framework中有非常重要的作用,所有面向.NET的语言都要先编译成IL,那么它们在逻辑上都需要支持IL的 主要特征。MSIL是将.Net代码转化为机器语言的一个中间过程。它是一种介于高级语言和基于Intel的汇编语言的伪汇编语言。当用户编译一 个.Net程序时,编译器将源代码翻译成一组可以有效地转换为本机代码且独立于CPU 的指令。当执行这些指令时,实时(JIT)编译器将它们转化为CPU特定的代码。由于公共语言运行库支持多种实时编译器,因此同一段MSIL代码可以被不 同的编译器实时编译并运行在不同的结构上。从理论上来说,MSIL将消除多年以来业界中不同语言之间的纷争。在.Net的世界中可能出现下面的情况:一部 分代码可以用Effil实现,另一部分代码使用C#或VB完成的,但是最后这些代码都将被转换为中间语言。这给程序员提供了极大的灵活性,程序员可以选择 自己熟悉的语言,并且再也不用为学习不断推出的新语言而烦恼了。
7. CTS(Common Type System,通用类型系统)
类 型是数据的一种表达方式,不同编程语言定义的基本数据类型各不相同。既然要实现语言之间的“沟通”,就需要一个规范来实现“不同”数据类型(也许只是名称 不同,而实质相同)间的映射关系。便于使用.Net Framework在各种语言之间进行交互操作。CTS就完成这个工作。
8. JIT(Just-In-Time)
从全称也可以看出:强调实时,也就是中间代码实时执行时,才针对本地计算机的不同,被编译成本机代码。
9. 程序集(Assembly)
是.NET 程序的最小组成单位。每个程序集都有自己的名称、版本等信息。程序集通常表现为一个文件(.exe或.dll文件),这样的程序集被称为单文件程序集,这 种程序集是最常见的。程序集也可以由多个文件组成,每个文件都是一个模块文件或者是一个资源文件,这样的程序集被称为多文件程序集。下面来了解一下如何生 成单文件程序集和多文件程序集。
10. PE(可移植可执行Portable Executable)文件
PE文件是一个非常重要的概念,它由PE表头、CLR表头、元数据和IL(中间语言)代码四部分组成。
Ø PE表头:主要指出了文件的类型,GUI(图形用户)、CUI(控制台)或是DLL(在.NET中DLL特指程序集文件的一种形式,不同于以前的动态链接库文件)。
另外该表头还包括一个时间标记用于表示文件创建的时间。对于仅包含IL代码的模块该表头的大部分信息会被忽略。对于包含有本地CPU代码的模块,
该表头还会包含有关本地CPU代码的一些信息。
Ø CLR表头:包含标识托管模块的一些信息(可以被CLR或者一些使用工具解析)。这些信息包括托管模块所需要的CLR版本号,一些标记,托管模块入口点
方法(MethodDef)元数据标记,以及有关托管模块的元数据、资源、强命名标记和其他一些意义不是太大的信息的位置和尺寸。
Ø 【元数据】(表):该表用于描述代码中用到的类型和成员,描述的类型和成员有两类,一是源代码中定义,一是引用的。元数据总是和包含IL代码的文件
相关联,实际上元数据总是和这些代码一起被嵌入到同一个exe/dll文件中,编译器总是同时产生元数据和IL代码,并且总是同时将它们嵌入到生产的托管模
块中,两者始终保持同步。
元数据的用处:
@元数据省去了源代码编译时对头文件和库文件的需求。这是因为在含有实现类型和成员的IL代码文件中,已经包含了所有被引用的类型和成员的信息,
编译器可以直接从托管模块中读取元数据来获得这些信息。
@Visual Studio.NET的智能感知(Intellisense)功能是通过分析元数据来实现的。
@CLR代码验证过程可以利用元数据来确保代码仅执行“安全”的操作。
@利用元数据,可以将一个对象的字段序列化后发送到远程机器,然后在远程机器上执行反序列化,从而重新创建对象和它的状态。
@利用元数据,垃圾收集器可以追踪对象的生存期。对于任何对象,垃圾收集器都能通过元数据来确定该对象的类型,并且可以获知该对象的哪些字段引
用了其他对象。
Ø IL代码:编译器在编译源代码是产生的指令,CLR运行时将它们编译成本地CPU指令。
11. 托管模块(managed module
托管模块是一个需要CLR才能执行的可移植可执行(Portable executeable 简称PE) 文件。