第6讲:如何使用.NET开发Windows应用程序
时间:2010-10-07 来源:山天大畜
2004.12.21 欧岩亮
课程介绍
深入Microsoft .NET Framework
基础内容
熟悉.NET
课程内容
程序的托管执行(Managed Execution)
程序集(Assemblies)
名称空间(Namespaces)
委托(Delegates)
线程
应用程序域(AppDomains)
Framework类
程序中的属性(Programming Attribute)
数据类型
反射
Framework编程
托管执行
托管代码和非托管代码
托管代码是第一次编译形成中间代码以后的代码,它在进入执行的时候,要进行第二次编译。它不是计算机上的本地代码,而是一种中间形式的代码。
托管代码和非托管代码的本质区别:一个是中间代码来表示;一个是本地的机器语言。
公共语言运行时(Common Language Runtime,CLR)
当托管代码被编译器第一次编译以后,在应用程序被加载的时候,公共语言运行时会提供一些类的加载库。把托管代码中的程序加载到内存之后,它会通过JIT实时地把托管代码编译为本地代码然后执行。
中间语言(Intermediate Language,IL)
经过编译器第一次编译以后形成的应用程序集应该是用中间语言来表示的托管代码,在真正执行的时候,CLR会把托管代码加载到内存当中并且进行实时编译。这种托管代码其实是多平台一致的,但是在真正运行的时候,会根据当前平台上的一些代码的特性进行实时编译形成本地代码。
ILDASM
这个工具可以用来反编译托管代码。
公共类型系统
保证了多语言的互操作。
内存管理
非确定性的内存回收:当我们把指针设置为null的时候,指针这时并没有被释放,因为有垃圾回收机制。
垃圾回收:周期性地回收没有被指针指向的内存空间。
IDispose:给开发人员一定的机会来回收非托管代码中消耗的资源。托管资源的内存由垃圾回收自动回收,而在托管代码中引用的非托管对象,垃圾回收是不负责回收的,例如文件句柄,当我们要使用文件句柄时,我们一定要实现IDispose接口来主动回收资源。
托管代码的执行过程
代码第一次编译形成IL中间语言的托管代码,在运行时被Class Loader装载后进行JIT第二次编译形成托管的本地代码。在执行过程中,它会不断地检查当前我们执行的代码的安全性和规范性。
Class Loader在装载可执行程序exe或者动态链接库dll的时候,它不是把所有的exe和dll当中的类库全部装载到内存里面。它是先装载一部分,即Main函数所在的文件,然后在执行过程中Class Loader会不断地判断当前执行过程中所要调用的方法是否已被装载到内存中了,如果没有,它会实时地去装载一些没有被装载的代码。装载进来之后,被编译为托管的本地代码,然后调用。
公共语言运行时(CLR)
线程支持
类型检查
安全引擎
MSIL到本地编译
代码管理器
垃圾回收
类装载器
COM Marshaller:COM组件的互操作
异常管理
调试器
公共类型系统
创建了一个框架,能够帮助实现不同语言之间的互操作,类型安全和高性能的代码执行
提供了一套统一的面向对象模型,可以完全的支持所有的语言
定义的一套语言规范,能够帮助不同语言之间进行交互
程序集(Assemblies)
一个程序集是一组类型和资源的集合,共同组成一定的逻辑功能
包含一个类型或程序的清单(manifest),类型原数据,MSIL,资源
程序集清单描述了应用程序集里面都有哪些类型,这些程序都存放在什么地方。它规定了我的这些代码都在什么地方,可能在磁盘的某个位置,另外的一部分资源可能在Internet上。Manifest最终被Class Loader所用,Class Loader在动态加载类库的时候,就需要知道类库在哪个位置的哪个文件里。我们在编写应用程序的时候,实际上我们可以把程序集清单里面的Assembly的位置描述为在一个互联网上的Http地址,Class Loader在实时地加载这个类的时候它会从Http这个路径去加载远程服务器上的Library过来,这杨就实现了零部署,我们不用在更新了Dll之后强迫客户端更新。
所有能够部署的单元都是编译过的MSIL(可执行的中间代码)
轻便的可执行文件(PE file)EXE或者是DLL
在.NET Framework程序在执行的时候,它有一个公共类型系统,这些公共类型系统的实现都在CLR里面。我们在运行程序的时候,使用到了大量的Framework中所定义好的类库,而客户端在执行应用程序的时候实际上已经安装了Framework,也就是说它已经帮我们在客户端部署了很多已经存在的功能。我们的程序在完成后,有很多类库不需要包装在我们的执行文件里面,我们只需要把执行文件放到客户端,去调用客户端的Framework里面的类库。这样我们编写的应用程序规模就很小,但它执行起来内存占用量比较大。
可以用ILDASM和反射(reflection)来检查程序集
可以是单一的文件或多个文件
名称空间
名称空间是一个命名的容器
名称空间可以按照层次的方式来组织类
避免命名冲突
帮助提示类的用途
名称空间可以跨越工程/程序集
推荐:CompanyName.Project<.Module>.Class
举例:Northwind.OrderEntry.Order
演示一
程序集和名称空间