第一章 体系结构
一、 基本概念
1. .Net的优点
Ø 面向对象编程
Ø 优秀的设计:一个基类库,它是以一种非常直观的方式设计出来的
Ø 语言的无关性
Ø 对动态Web页面的更好支持
Ø 高效的数据访问
Ø 代码共享
Ø 增强的安全性
Ø Web服务的支持
Ø 对安装没有任何影响
Ø C#:是使用.NET的一种面向对象的新语言
Ø Visual Studio 2005
2. .Net FrameWork2.0新增特性
Ø SQLServer集成
Ø 64位支持
Ø 泛型
Ø 匿名方法
Ø 可空类型
Ø 迭代器
Ø 部分类
3. C#优点
Ø 完全支持类和面向对象编程,包括接口和继承、虚函数和运算符重载的处理。
Ø 定义完整、一致的基本类型集。
Ø 对自动生成XML文档说明的内置支持。
Ø 自动清理动态分配的内存。
Ø 可以用用户定义的特性来标记类或方法。这可以用于文档说明,对编译有一定的影响(例如,把方法标记为只在调试时编译)。
Ø 对.NET基类库的完全访问权,并易于访问Windows API。
Ø 可以使用指针和直接内存访问,但C#语言可以在没有它们的条件下访问内存。
Ø 以Visual Baisc的风格支持属性和事件。
Ø 改变编译器选项,可以把程序编译为可执行文件或.NET组件库,该组件库可以用与ActiveX控件(COM组件)相同的方式由其他代码调用。
Ø C#可以用于编写ASP.NET动态Web页面和XML Web服务。
4. C#局限性
Ø 该语言不适用于编写时间急迫或性能非常高的代码,例如一个要运行1000或1050次的循环,并在不需要这些循环时,立即清理它们所占用的资源。在这方面,C++可能仍是所有低级语言中的佼佼者。
Ø C#缺乏性能极高的应用程序所需要的关键功能,包括保证在代码的特定地方运行的内联函数和析构函数。但这类应用程序非常少。
5. 公共语言运行库
.NET Framework的核心是其运行库的执行环境,称为公共语言运行库(CLR)或.NET运行库。通常将在CLR的控制下运行的代码称为托管代码(managed code)。
但是,在CLR执行开发的源代码之前,需要编译它们(在C#中或其他语言中)。在.NET中,编译分为两个阶段:
(1) 把源代码编译为Microsoft中间语言(IL)。
(2) CLR把IL编译为平台专用的代码。
6. 托管代码的优点
Ø 平台无关性
Ø 提高性能
Ø 语言的互操作性
语言互操作性的真正含义是用一种语言编写的类应能直接与用另一种语言编写的类通信。特别是:
1、 用一种语言编写的类应能继承用另一种语言编写的类
2、 一个类应能包含另一个类的实例,而不管它们是使用什么语言编写的。
3、 一个对象应能直接调用用其他语言编写的另一个对象的方法。
4、 对象(或对象的引用)应能在方法之间传递。
5、 在不同的语言之间调用方法时,应能在调试器中调试这些方法调用,即调试不同语言编写的源代码。
7. 中间语言的主要特征
Ø 面向对象和使用接口
Ø 值类型和引用类型之间的巨大差别
Ø 强数据类型
Ø 使用异常来处理错误
Ø 使用特性(attribute)
8. 程序集
Ø 私有程序集
私有程序集是最简单的一种程序集类型。私有程序集一般附带在某些软件上,且只能用于该软件中。附带私有程序集的常见情况是,以可执行文件或许多库的方式提供应用程序,这些库包含的代码只能用于该应用程序。
系统可以保证私有程序集不被其他软件使用,因为应用程序只能加载位于主执行文件所在文件夹或其子文件夹中的程序集。
用户一般会希望把商用软件安装在它自己的目录下,这样软件包没有覆盖、修改或加载另一个软件包的私有程序集的风险。私有程序集只能用于自己的软件包,这样,用户对什么软件使用它们就有了更多的控制。因此,不需要采取安全措施,因为这没有其他商用软件用某个新版本的程序集覆盖原来的私有程序集的风险(但软件是专门执行怀有恶意的损害性操作的情况除外)。名称也不会有冲突。如果私有程序集中的类正巧与另一个人的私有程序集中的类同名,是不会有问题的,因为给定的应用程序只能使用私有程序集的名称
因为私有程序集完全是自含式的,所以安装它的过程就很简单。只需把相应的文件放在文件系统的对应文件夹中即可(不需要注册表项),这个过程称为“0影响(xcopy)安装”。
Ø 共享程序集
共享程序集是其他应用程序可以使用的公共库。因为其他软件可以访问共享程序集,所以需要采取一定的保护措施来防止以下风险:
1、 名称冲突,另一个公司的共享程序集执行的类型与自己的共享程序集中的类型同名。因为客户机代码理论上可以同时访问这些程序集,所以这是一个严重的问题。
2、 程序集被同一个程序集的不同版本覆盖——新版本与某些已有的客户机代码不兼容。
这些问题的解决方法是把共享程序集放在文件系统的一个特定的子目录树中,称为全局程序集高速缓存(GAC)。与私有程序集不同,不能简单地把共享程序集复制到对应的文件夹中,而需要专门安装到高速缓存中,这个过程可以用许多.NET工具来完成,其中包含对程序集的检查、在程序集高速缓存中设置一个小的文件夹层次结构,以确保程序集的完整性。
为了避免名称冲突,共享程序集应根据私有密钥加密法指定一个名称(私有程序集只需要指定与其主文件名相同的名称即可)。该名称称为强名(strong name),并保证其惟一性,它必须由要引用共享程序集的应用程序来引用。
9. 反射
因为程序集存储了元数据,包括在程序集中定义的所有类型和这些类型的成员的细节,所以可以编程访问这些元数据。这个技术称为反射。
10. 模块
包含了类型信息和实现的PE格式文件称为一个模块(Module),模块是运行时类型加载的基本单位。如果程序引用了模块中的某个类,那么CLR将会将整个模块加载到内存中
11. 类集
类集是.NET中相关类型的物理组织形式。它是进行应用程序部署、版本控制、重用和权限分配的基本单位。类集包含了类集清单(Manifest)、在类集中定义的类型信息(Metadata)、类方法的实现代码以及其他资源。类集可以由一个或多个文件组成,这些文件或者包含资源数据,或者是包含类型信息和实现的PE格式文件。
二、 编译原理
1. 原理介绍
1) 用C#开发一些程序
2) 用C#编译器或CLS兼容的编译器编译成EXE
3) 编译器将生成的IL代码和附加信息(manifest)放入拥有一个标准PE头的Win32可执行文件的只读部分。
4) 编译器在创建这个可执行文件时导入(import)一个名为_CorExeMain的函数。这个函数是.NET EE(execution engine)--.NET运行期引擎的入口函数。
5) 当执行这个Win32可执行文件时,因为其主要是依赖于DLL的PE文件,操作系统将会调用位于MSCorEE.DLL中的_CorExeMain函数。
6) 操作系统通过PE文件里的进入点,调用MSCorEE.DLL。并能保证在Windows里可以有很多程序同时运行。
7) 因为操作系统不能执行.NET IL代码,EXE里的进入点只是简单的中介,它将指示操作系统调用_CorExeMain函数。
8) 随后_CorExeMain函数开始解释位于PE文件中的IL代码。
9) 因为IL是不能被直接执行的, .NET EE使用称为JITter (Just In Time compiler)的即时编译器将IL代码编译成本地CPU机器代码用于执行。这一即时编译过程只在第一次执行的时候进行。