《.Ne框架程序设计》随记(1)

简介:
.net是什么,这个问题确实很难回答?就连微软在描述它的时候也是含含糊糊的,为何呢?因为它确实内容太丰富了。它最吸引人也是它一直推崇的技术就是web服务了,这是指企业通过xml这种统一的文档格式,并且通过一定的业务逻辑编程接口来向外界提供所需信息,而这样的编程接口可以通过远程网络进行调用。.net平台就是关于人,信息,设备之间的互联的。就如同windows操作系统将应用程序对外部设备的访问进行抽象化一样,net framework也为我们提供了一个抽象了xml web服务的开发平台。客户通过创建特殊格式的xml(SOAP,也就是简单对象访问协议)来描述一个对服务器的请求,然后发送给服务器,服务器端对xml数据进行分析,处理客户的请求(可能还有web服务之间的通信和交互),再把结果以xml格式的形式发送回客户端。

    而提供web服务的计算机必须运行在一个能够侦听SOAP请求的操作系统上,但不一定非得是windows,实际上,任何能够侦听TCP/IP套接字接口(socket),并且能够对这个端口进行读写字节的操作系统都可以,因此,在未来,移动电话,汽车,电冰箱,微波炉等等各种设备可以参与到web服务的世界中来。在客户端,操作系统必须能够在套接字端口读取字节以发送服务请求,而且系统还要能够提供各种功能来满足用户应用程序的需求,如创建窗口或者菜单等。而.net平台就为我们提供了服务器端和客户端各种所需要的功能,使我们可以把注意力放在业务逻辑上,而把底层的通信协议和基础构造等细节交给微软好了,毕竟这是它应该做的。

    由于服务器端运行web服务,客户端使用web服务的应用程序都需要操作系统的支持,而微软在winXP和windows .net服务器家族产品中都添加了xml web服务支持,特别地,在其中集成了.net passport xml web服务支持,passport是一种用户认证服务。这样用户在访问不同的站点时就不需要重复输入用户名和密码了,就给我们带来了极大的方便。此外,这些产品还对使用.net framework技术实现的应用程序的加载和执行提供了内置的支持。最后,还有一个新型的,可扩展的即时消息通知应用程序.这个应用程序允许第三方厂商和它们的客户进行无缝通信.也就是说企业应用可以自动通知消息给其客户.

    微软不光只提供web服务的底层技术,还提供了面向用户的xml web服务,也就是”.net my services”.此外,还提供了一系列的.net 企业服务器,如BizTalk Server2000,Exchange 2000等。

.net framework包含两个部分:通用语言运行时(CRL)和.net框架类库(FCL)其中CRL可以看成是在操作系统上基础上封装的一层虚拟机。.它们提供了以下服务:

1)              一致的编程模型.当前的操作系统来说,有些功能需要通过动态链接库(DLL)来访问,而某些功能需要通过COM对象来访问.而在.net framework下,所有的应用程序服务都将以一种一致的,面向对象的编程模型提供给开发人员.也就是程序集(Assembly)

2)              简化的编程方式.CLR的一个目的就是简化win32和COM环境下所需要的各种复杂的基础构造,使我们可以抛弃注册表,全局唯一标识符(GUID)等概念.当然,我们也可以和现存的非.net代码进行互操作.

3)              可靠的版本机制.”:Dll hell”版本问题是由于为一个新应用程序所安装的组件覆盖了一个现有应用程序正在使用的组件,但.net framework采用了一种新的版本机制来隔离应用程序组件(Assembly),这种隔离策略可以保证一个应用程序总可以加载它当初生成和测试时用的组件,这就避免了”DLL hell”.

4)              轻便的部署管理.以前的windows应用程序很难安装部署.因为安装一个应用程序要考虑很多东西:各种文件,注册表设置等.而在.net framework下,组件将不再受注册表的任何引用,实际上它只不过是将文件拷贝到一个目录下,然后加一个快捷链接到[开始]菜单,桌面以及[快速启动]而已.同时,卸载应用程序就只要简单删除它们就行了.

5)              广泛的平台支持.编译器编译.net代码时,它实际上产生的通用中间语言(CIL),只有在运行时,CLR才将CIL翻译为cpu指令.这就意味着只要机器上包含CLR和FCL,就可以将。Net应用程序部署到机器上.

6)              无缝的语言集成.COM允许不同的语言之间进行互操作,而.net framework则允许不同的语言进行无缝集成.例如,可以用vb.net写一个类,再在c#.net中继承它.这是因为CLR要求这些语言都遵循通用类型系统(CTS)的规范.而通用语言规范(CLS)则描述了语言集成时必须要遵循的规范.

7)              简便的代码重用.组件的复用使代码的重用十分简单了.

8)              自动化的内存管理(垃圾收集).CLR会自动追踪资源的使用情况,确保不发生”内存泄漏”.

9)              强类型安全.CLR可以确保所有的代码都是类型安全的.这确保了系统分配的对象总能够以正确的方式被访问.例如,假设方法声明的参数是一个4字节的数组,那么CLR会阻止我们给其传递一个8字节的数组.它还意味着应用程序的执行流程只能向已经确知的位置传递(也就是真正的方法入口点).也就是说,我们不能构造一个指向某个内存位置的任意引用,然后让应用程序从那个地址开始执行.这就减少了很多编程错误和一些系统攻击(如利用系统缓冲区进行攻击).

10)          丰富的调试支持.CLR完全支持跨语言调试.

11)          统一的错误报告.一些函数通过返回win32状态码,一些函数通过返回HRESULT,还有一些函数则通过抛出异常来报告错误。而在CLR中,所有的调用都是通过异常来报告错误的。这使我们能够将恢复代码和真正的应用程序逻辑代码分开来实现。此外,异常还有跨模块和跨语言的特性,而且和状态码和HRESULT不同的是,异常不能被忽略.CLR还提供了内置的堆栈遍历机制,这使我们可以容易定位任何的bug和调用失败.

12)          全新的安全策略.以前的操作系统的安全机制都是基于用户帐号来提供隔离和访问控制的。从本质上来说,它假设的是所有的代码都具有相同的信任度.但随着可移动代码(如web脚本,下载的应序等),我们就需要一种以代码为中心的控制方式.CLR中的代码访问安全(CAS)为我们提供了这种方式的实现机制.

13)          强大的互操作能力. .net framework从一开始就对访问现有COM组件,以及调用传统DLL中的win32函数提供了完全的支持.

    不同的语言有不同的能力.比如非托管的c/c++中可以对系统有着相当底层的控制,从而进行内存管理,甚至可以方便地创建好几个线程.而用vb,我们可以高效地创建用户界面程序,控制COM对象和数据库也容易.我们可以用任何支持CLR的语言来创建源代码文件,用相应的编译器做语法检查和源代码分析,生成的都是一个托管模块,这是一个需要CLR才能执行的标准windows可移植(portable execurtable)文件.

托管模块的组成部分:

 

部分                            描述 

PE表头                         标准windows PE文件表头.类似于通用对象文件格式(COFF)表头,该表头指出了文件类型:GUI,CUI(控制台用户界面),或者DLL(和以前的动态链接库文件,即以动态链接的方式提供的一组函数库不同,.net中的DLL特指程序集文件的一种形式),此外该表头还包括一个时间标识用于表示文件创建的时间.对于仅包含IL代码的模块,该表头的大多数信息会被忽略.对于包含有本地CPU代码的模块,该表头还会包含有关本地CPU代码的一些信息

CLR表头                       包含标识托管模块的一些信息(可以被CLR或者一些实用工具解析),这些信息包括托管模块所需要的CLR版本号,一些标识,托管模块入口点方法(Main方法)的MethodDef元数据标识.以及有关托管模块的元数据,资源,强命名,标记和其他一些意义不是太大的信息的位置和尺寸

元数据                          每个托管模块都包含有一些元数据表,它分两种,一种用于描述源代码中定义的类型和成员,一种用于描述源代码中引用的类型和成员.简单说,它就是一个数据表的集合,它总是和包含IL代码的文件相关联.实际上,元数据总是和代码一起被嵌入到同一个EXE/DLL文件

 

中间语言(IL)代码                编译源代码时产生的指令,CLR在运行时将IL代码编译为本地CPU指令,由于生存期和执行受CLR管理,也叫托管代码.

元数据用很多用处:

1)省去了源代码编译时对头文件和库文件的需求.因为在含有实现类型和成员的IL代码文件中,已经包含了所有被引用的类型和成员的信息,因此编译器可以直接从托管模块中读取元数据来获得这些信息.

2)可以利用元数据来辅助我们写代码.Vs.net的智能感应特性就是通过分析元数据来告诉我们某个类型提供了哪些方法,以及某个方法有哪些参数.

3)CLR 的代码验证可以利用元数据来确保代码仅仅执行”安全”的操作.

4)可以将一个对象的字段序列化到一个内存块中,然后远程传送给另一台机器,最后再在远程机器上执行反序列化,从而重新创建对象和它的状态.

5)垃圾收集器可以追踪对象的生存期,任何对象,垃圾收集器都能够通过元数据来确定对象的类型,并且可以获知该对象的哪些字段引用了其他对象。



本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2006/08/31/490898.html,如需转载请自行联系原作者
目录
相关文章
|
8月前
|
设计模式 Java 编译器
重温经典《Thinking in java》第四版之第五章 初始化与清理(二十九)
重温经典《Thinking in java》第四版之第五章 初始化与清理(二十九)
48 0
|
8月前
|
Java C语言
重温经典《Thinking in java》第四版之第四章 控制执行流程(二十四)
重温经典《Thinking in java》第四版之第四章 控制执行流程(二十四)
43 1
|
3月前
|
设计模式 算法 Java
重温经典《Thinking in java》第四版之第九章 接口(四十七)
重温经典《Thinking in java》第四版之第九章 接口(四十七)
26 0
|
3月前
|
Java 编译器 C++
重温经典《Thinking in java》第四版之第九章 接口(四十六)
重温经典《Thinking in java》第四版之第九章 接口(四十六)
15 0
|
4月前
|
Java
重温经典《Thinking in java》第四版之第七章 复用类(三十九)
重温经典《Thinking in java》第四版之第七章 复用类(三十九)
13 1
|
4月前
|
安全 Java 编译器
重温经典《Thinking in java》第四版之第七章 复用类(四十一)
重温经典《Thinking in java》第四版之第七章 复用类(四十一)
30 1
|
7月前
|
Java 程序员 数据安全/隐私保护
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十六)
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十六)
47 0
|
7月前
|
Java 程序员 数据安全/隐私保护
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十八)
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十八)
26 1
|
7月前
|
Java 数据安全/隐私保护
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十七)
重温经典《Thinking in java》第四版之第六章 访问权限控制(三十七)
37 0
|
8月前
|
安全 Java 程序员
重温经典《Thinking in java》第四版之第五章 初始化与清理(三十)
重温经典《Thinking in java》第四版之第五章 初始化与清理(三十)
34 0