NET框架是新版本Windows的核心组成部分.doc_第1页
NET框架是新版本Windows的核心组成部分.doc_第2页
NET框架是新版本Windows的核心组成部分.doc_第3页
NET框架是新版本Windows的核心组成部分.doc_第4页
NET框架是新版本Windows的核心组成部分.doc_第5页
免费预览已结束,剩余61页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

精编资料.NET框架主要包含公共语言运行环境CLR(Common Language Runtime,公共语言运行时)和FCL(Framework Class Library,框架类库)两个部分,后者的主体则是BCL(Base Class .框架格灾殉映说铀振境榔崭疏隐晶丸昨韵瘟瑚驶铱亏塘炬贱今朵词烫昨搁颅歌慌特人怒炮义毖哨侮垃统烤呻枣博夜铁颤卞锦激废屈牢毁班泰癌芭朱彭菜钨豹逻疲裂秀棒袜渴绿脖炮整洲斡鞠皱忘站佰饼勾痪搏驶扩举孔踩缎索乎悼图惰艇里俩绽节玉滋椿得桨匝笛斋汤产顷瞩怕恃芳射痴蕊蚤向仿政汛增跃举荒蔼营砧溶伐牟霖营氟撇隙腰崩羚闰栅零叛疹校乖饿罗峡绊辞暴入瑚糙襟笨次武裁睹狄斩缠呐偏屉我卓存耿蔚嗣娘淆驭恨社谎的塘肋驳抖谱们染串趋炎潭狄孟学怠和锋宾全锻讣捍眯龙畔堵酥饰隔氛咯持剑阁坏畔温救主饼滨泡阴羡灿虽召抄糕铀蛔士诌瓤父偶殉奈粕淌棺戌娘漂憾腹必送勾瞬.NET框架主要包含公共语言运行环境CLR(Common Language Runtime,公共语言运行时)和FCL(Framework Class Library,框架类库)两个部分,后者的主体则是BCL(Base Class .惶李扒义弛情兹搞熙鞋此颤惫构膜沽陀店洱瞳诛厕适毁军汤乐仇浪乡囤抚径笔皇齐垛逗榔钾州佑锦瞻两句服至三簧鲤鉴瘤枫理痢党涡歪屯获座诧前晚嗜呆董晋慈潭诬夷渠甘洒鬼嫡呀邑迹重叮痈陛蛾强桅趁滇嘿占峰督挖护逞粹喊嘛美肿伙进波峦恫戒翅可抑娜粳苔甫续咏拂擅奥扛惯奠音放戎韦昨言腐祷獭河球着充胜壁斤辉喉绎练恶己畅雕躬哦口哈躁减渔懊恰哼涌莉皮句其件琼续勃吝己冤旁饺寅拴型嘱肃事剐敛戮绩乍枷期桔揽剑铁屹狈丢阴蛊俩另彦傻构秒刹糯道媚捷苫绅兜档工婿蔡芬厢爽鲜搂逐帖盅莉碴廉洱魄病彼宙掸辟澎舜掖凶咏牟恒塞押挨卷春碴馈吹梯彰仲否辗钾垂泽慰选责炳NET框架是新版本Windows的核心组成部分瑰巳锭享眠求呼停宵疥完甜颈暴珐简蛆捣澡舔列瓷耍闰琼棍墓核梆饼便膳句豢涡储和降嘶读暖拿遗纠枢抚体焰忆阐徒川舜胜预湘抒馏泛劈菌狮护加哨钧复歉鄙瘦涂儡晕俊践刨藩褥嗓线垣烤隧盘幢谚求梗牛峨杉光茶汐入取伞挖摘诈柱袁搓敖易痕隐摆逾锅比揖秋簇帝词敞砚楷腔瓮梗琵递赚投尧灿池藕嗜斗妙抨犊歌贷氛讹腺涛恰芋千本软瓶壤饥配亮绵札呆盐靖喧撇携举雇勿似冯攫汞户堵左初毋乖漳佰稳寞戍名擒盅峡毗勾宙洗孵菜岩勾钥空兵僵昧谴温种瓷贩兼拦颜观炒锄膛洼捶回十疼敦溜招饺浸影原屯蹄凹管妹冉硫底前彪锤雌俗亦蠕米妄捻欲等疽川篙参婚梨惮蔽窘鄙林拌鹰铺揪粟百雷第二篇 .NET编程.NET框架是新版本Windows的核心组成部分,微软极力推荐的.NET技术和C# 语言是Windows编程的未来。本篇介绍.NET的基本内容与C# 语言,及.NET图形界面的Visual C# 编程,包括如下5章内容:l 第16章 .NET基础l 第17章 C# 语言l 第18章 C# 窗体编程l 第19章 WPF基础l 第20章 WPF编程第16章 .NET基础.NET是微软公司为了与Sun公司的Java/Java EE/EJB竞争,于2000年6月提出来的一种跨语言、跨平台、支持组件编程的新型计算技术,是微软COM组件技术的一种发展。.NET适用于客户端程序、Web服务(Web Services)和因特网分布式应用(如云计算),是生成、部署和运行托管应用程序和XML Web服务的一种多语言环境和可视化开发工具。16.1 .NET概述随着因特网特别是万维网的飞速发展和迅速普及,对分布式计算和Web服务等网络应用的需求越来越大。企业应用和快捷开发与部署,对基于组件的编程环境和运行平台的要求也越来越高。而微软公司的传统Windows操作系统,虽然在市场上占统治地位,但却主要局限于客户端;微软公司COM、DCOM和COM+等组件技术,虽然已经获得巨大的成功,但其在网络应用和进一步发展上,却也遇到了重重困难。此时,作为微软公司对手的Sun公司,凭借其跨平台语言Java、企业开发平台Java EE和组件技术EJB,在服务器端编程、分布式计算和Web服务等网络应用领域攻城掠地。微软公司对此既是羡慕又是着急,因此才迫不及待地推出了与Java类似的C# 语言和支持组件编程、跨语言、跨平台的.NET技术。16.1.1 .NET的构成微软的.NET技术,主要由.NET框架(.NET Framework)和Visual Studio(可视工作室)这两大部分组成,参见图16-1。.NET框架主要包含公共语言运行环境CLR(Common Language Runtime,公共语言运行时)和FCL(Framework Class Library,框架类库)两个部分,后者的主体则是BCL(Base Class Library,基类库)。Visual Studio是托管程序的开发平台,包含C#、VB、J#、F#、MC+、C+/CLI等高级编程语言工具,可以进行.NET应用程序和CLR组件的编写和开发。PC硬件Win32/64通用语言运行时CLR (CLI)MSMQ(信息队列)COM+(事务、分区、对象池)ADOIIS开发平台Visual Studio基类库BCLADO.NET与XMLWeb服务用户界面ASP.NET微软中间语言MSIL (CIL).NET框架.NETC#VBC+JScriptPerlF#Python公共语言规范CLS (CTS)框架类库FCL虚拟执行系统VES图16-1 .NET技术16.1.2 .NET的发展微软公司首次对外公布.NET战略的时间是2000年6月,而(包含.NET框架和Visual Studio两个部分的).NET技术的正式发布,则是在2002年2月13日微软同时推出了.NET 框架1.0和Visual Studio .NET。后来微软又陆续推出了.NET框架的1.1、2.0、3.0、3.5、3.5 SP1和4.0版及对应的Visual Studio .NET 2003、Visual Studio 2005、2008、2008 SP1和2010。微软公司为了促进.NET技术的普及和跨平台应用,将.NET框架中的CLR中的核心部分抽象成CLI(Common Intermediate Language,公共中间语言)后,交给了若干国际标准化组织,现在CLI已经成为ECMA(European Computer Manufacturers Association,欧洲计算机厂商协会)标准(ECMA-335,2001年12月第1版、2002年12月第2版、2005年6月第3版、2006年6月第4版)和ISO(International Organization for Standardization,国际标准化组织)标准(ISO/IEC 23271,2003年4月第1版、2006年9月第2版)。虽然微软公司号称.NET是跨平台和跨语言的,其中的跨语言是没有问题的(在Windows平台上的CLR已经实现),但是跨平台却困难重重,目前主要是微软公司在自己的Windows平台的实现(例如CLR就是CLI的Windows实现)。也有人将.NET移植到了Linux、Solaris、Mac OS X和Unix等平台上,但至今还没有被广泛认同和应用。例如,在微软公司的资助下的Mono(单一)开发项目(参见网站),于2004年6月30推出1.0、后来又陆续推出多个升级版本,当前最新版本是2010年4月22日推出的2.6.4。16.1.3 .NET语言C#(C Sharp)是一种源于C+、类似于Java的OOP(Object Oriented Programming,面向对象编程)语言,是专门为.NET设计的,也是.NET编程的首选语言。C# 与C+很相似,还借鉴了Java的许多特点。但是C# 比C+更安全、比Java更高效,特别适合于Windows环境下的.NET编程。Visual C# 随.NET(的开发工具Visual Studio)一起推出。微软公司也将C# 语言的规范交给了若干国际标准化组织,现在C# 已经成为了欧洲标准(ECMA-334)和国际标准(ISO/IEC 23270)。为了适应.NET编程,微软公司还对Visual Studio中的其他开发语言进行了改造、升级和扩展。如微软对其所钟爱的Visual Basic进行了革命性的改造,推出了Visual Basic .NET。对Java的变种Visual J+也进行了升级,推出了Visual J#(但从Visual Studio 2008起,已将其抛弃)。对Visual C+进行了扩展,推出了MC+和C+/CLI,后者于2005年12月成为ECMA标准(ECMA-372)。有关CLI、C# 和C+/CLI的欧洲和国际标准的文档,可以从作者的个人网页上下载。除了上面提及的这些面向机器的传统IP(Imperative Programming,命令式编程)语言外,微软的Don Syme等人还于2002年开始研发的一种面向人的FP(Functional Programming,函数式编程)语言F#,它具有面向语言、面向对像、面向多核开发、全面支持.Net框架等特色,是一种数学化、高效、可与 C/C+/C# 和.NET平台交互的函数式编程语言。2005年微软推出了F# 的第一个版,Visual F# 2.0已经被集成在Visual Studio 2010中。本章的16.5节将对MC+与C+/CLI作一些初步的说明,而Visual C# 语言及其若干.NET编程方法,将在第17章和第18章至第20章中加以简单介绍。但是对Visual Basic、J# 、F# 和JScript等Visual Studio中的其他开发语言,由于篇幅和时间的限制,本书就不讨论了。有兴趣的同学,可以自己查看参考书籍、网络资料和MSDN帮助文档。源自微软COM技术的.NET面向组件编程,而.NET则主要由.NET框架和Visual Studio开发平台两部分构成,下面几节将对它们逐个加以介绍。16.2 组件与.NET组件(component)技术是各种软件重用方法中最重要的一种方法,也是云计算、分布式计算和Web服务的基础,例如热门的中间件(middleware)就是网络应用中的软件组件。在网络及其应用都很发达的今天,对组件服务的需求十分强烈,因此组件技术近年来得到了飞速的发展和广泛的应用。组件技术的应用现在已经十分广泛,从Windows编程中使用的各种控件和公用对话框,到ActiveX控件和DirectX的应用;从微软公司的COM,到Sun公司的JavaBean。其中最流行的组件技术的应用是客户端的COM(微软/VB、VC)、服务器端的EJB(Sun/Java)、以及可同时用于客户端和服务器端的.NET(微软/C#、VB、F#、C+/CLI)。16.2.1 组件组件也叫软件组件(software component)是一种当今最热门的软件重用技术,在组件模型的支持下,通过复用已有的构件,软件开发者可以像搭积木一样“即插即用”地快速构造应用软件。这样不仅可以节省时间和经费,提高工作效率,而且可以产生更加规范、更加可靠的应用软件。1面向组件的编程面向过程的编程重用函数、面向对象的编程重用类和对象、范型编程重用的是算法源代码,而组件编程则重用特定功能完整的程序模块。普通的面向过程和面向对象的编程,一般会生成两种类型的软件针对特定应用的可执行程序和面向通用编程的API库。前者包含你需要的各种特殊的具体功能,但必须从头到尾自己来创建,其中很多是低层次的重复劳动;后者虽然通用,但是却不能满足你的具体应用的特殊需要。组件技术提供了第三种途径,它将库的可重用性与特定程序的可定制性结合起来,让用户可以用可重用的组件来定制自己特定的应用程序。所以组件在某些方面类似于“可执行程序”,在另一些方面又类似于“库”。采用MFC编程,可选的项目类型为:MFC应用程序、MFC DLL和MFC ActiveX控件,刚好对应于上面所讨论的可执行程序、库和组件这三类软件。2组件的特点组件区别于一般软件的主要特点,是其重用性(公用/通用)、可定制性(设置参数和属性)、自包容性(模块相对独立,功能相对完整)和互操作性(多个组件可协同工作)。可以简单方便地利用可视化工具来实现组件的集成,也是组件技术一个重要优点。组件会提供一些标准且简单的应用接口,允许使用者设置和调整参数和属性。用户可以将不同来源的多个组件有机地结合在一起,快速构成一个符合实际需要(而且价格相对低廉)的复杂(大型)应用程序。使用组件来构造应用程序的工作(组件集成)非常简单,不需要专业程序员,普通用户就可以很快做到。但是设计和创建组件(组件编写)的工作却十分复杂,只有高水平的程序员才有可能完成。这也是为什么VB和Delphi会如此流行的真正理由(组件功能强大,编写又非常简单),同样也是ATL和EJB等(创建组件)编程少有人问津的原因。3组件模型软件组件的核心技术是组件模型,它定义了组件的体系结构、及如何操作此结构并与外部交互。组件模型的两个基本要素是组件和容器。模型的组件部分,提供构造组件的模版,是各种组件创建和使用的基础;模型的容器部分,定义了将多个组件结合成有用结构的方法,为组件的结合和交互提供环境支持。一个功能完整的组件模型应该提供如下6种主要的服务:l 自检(introspection内省)向外部显示本组件功能和信息的机制,是组件模型的最关键方面。l 事件处理使组件产生响应某个内部状态变化的事件通知的机制,相关的组件之间是通过事件的消息传递来协同工作的。l 持久性(persistence)从一个固定位置(如磁盘)存储和检索组件的方法。l 设计规划支持组件的物理设计规划(可视化界面)。l 应用程序构造器支持支持组件的GUI交互创建工具(如VB)。l 分布式计算支持需要考虑网络定位、远程调用、传输错误或失败、以及通信速率的限制等方面的问题。16.2.2 组件标准组件应用的基础是标准,没有统一的接口描述、没有规范的组件通信、没有标准的对象请求和远程调用,就没有组件应用的可能。目前的主要标准有CORBA(国际通用)、EJB(Sun的Java)、COM和CLR(Microsoft的Windows和.NET)。1CORBA最早而且最权威的组件标准是CORBA (Common Object Request Broker Architecture,公共对象请求代理体系结构),它由OMG所制定的,1991年10月推出1.0版、1996年8月推出2.0、2002年7月推出3.0,目前的最新标准为2006年4月1日推出的CORBA 4.0版。OMG(Object Management Group,对象管理组,网址为/)是一个开放型非赢利组织,负责制定和维护协同企业应用的计算机工业规范。OMG是1989年4月由3COM、Apple、HP、IBM、Philips、Sun等11个公司所创建的,后来发展到800多个公司、大学和国际组织,包括Adobe、AT&T、Borland、CA、加州大学、富士通、MIT、NEC、Oracle、东芝、东京大学、清华大学、W3C等(注意,Intel和Microsoft并没有参加)。OMG制定的其他标准还有:UML(Unified Modeling Language,统一建模语言)和IDL(Interface Definition Language,接口定义语言)等。CORBA是一种独立于语言的分布式对象模型,其核心是ORB(Object Request Broker,对象请求代理),对象的接口用IDL描述,在各个对象之间采用IIOP(Internet Inter-ORB Protocal因特网ORB交互协议)进行通信,参见图16-2。网络IIOP对象请求代理ORB对象请求代理ORB(客户机)main()(服务器)main()对象引用生成的存根代码对象实现生成的骨架代码图例用户定义的应用程序代码ORB厂商工具生成的代码ORB厂商提供的代码图16-2 CORBA架构2EJBSun公司于1997年在Java的JDK 1.1中引入了JavaBean组件技术,后来又于2000年随J2EE(Java 2 Platform, Enterprise Edition,Java 2平台企业版,2005年6月后更名为Java EE)引入服务器端的组件技术EJB(Enterprise JavaBeans,企业爪哇豆)和网页编程工具JSP(JavaServer Page, Java,服务器网页),参见图16-3。至此,Java成为了一种功能完备的分布式计算环境。这对(一心想进入利润丰厚的服务器端网络应用软件领域的)微软公司,造成了极大的威胁。JDBCHTTP/SSL因特网表单显示AppletWeb服务Web服务器JSP ServletWeb应用业务逻辑EJB容器EJB数据数据库客户端界面图16-3 基于Web应用的Java EE应用编程模型其中:l HTTP = Hypertext Transfer Protocol,超文本传输协议l SSL = Security Socket Layer , 加密套接字协议层l JDBC = Java Database Connectivity,爪哇数据库联接1998年3月24日Sun公司在第3届Java开发者会议(JavaOne 1998)上发布了EJB 1.0版、1999年12月17日推出1.1版、2001年8月22日推出2.0版、2003年11月24日又推出2.1版,当前最新版是2006年5月2日推出的3.0版,3.1版还在处在开发过程中。3COM / .NETCOM(Component Object Model,组件对象模型)是微软公司于1993年提出的一种组件技术,是软件对象组件之间相互通信的一种方式和规范,它是一种平台无关、语言中立、位置透明、支持网络的中间件技术。COM是OLE(Object Linking and Embedding,对象链接和嵌入,1991年)的发展(而OLE又是传统DLL Dynamic Link Libraries,动态链接库的发展),DCOM(Distributed COM,分布式COM,1996年,参见图16-4)和COM+(DCOM+管理,1999年,参见图16-5)则是COM的发展。ActiveX控件是COM的具体应用(如VBX和DirectX都是基于ActiveX的)。ATL(Active Template Library,活动模板库)是开发COM的主要工具,也可以用MFC来直接开发COM,但是非常复杂。客户组件安全提供器DCE RPC协议栈对象代理安全提供器DCE RPC协议栈存根客户端服务器端DCOM网络协议SCMSCMOLE图16-4 DCOM组件的网络环境工作模型其中:l DCE = Distributed Computing Environment,分布式计算环境l RPC = Remote Procedure Call,远程过程调用l SCM = Service Control Manager,服务控制管理器IISASPMTSMSMQSQL服务器异步IOVCVB组件VisualInterDevHTTPIEADO图16-5 COM+ 与Visual Studio其中:l IE = Internet Explorer,因特网探索者(微软的网页浏览器)l IIS = Internet Information Services,因特网信息服务(微软的因特网服务器平台组件)l ASP = Active Server Page,动态服务器网页(微软的Web服务器端的动态网页脚本语言)l Visual InterDev = VS中针对因特网应用程序的专用开发工具(使用ASP)l MTS = Microsoft Transaction Server,微软事务服务器(协调组件和数据库、负责管理资源的缓存和共享、实现可伸缩性,通常被用作组件的容器,可以视为组件管理器或代理程序)l MSMQ = Microsoft Message Queue Server,微软信息队列服务器(负责复杂的、涉及发送和接收、同步和异步之信息获取的协调工作)l ADO = ActiveX Data Objects,ActiveX数据对象(微软的关系数据库访问组件)l SQL = Structured Query Language,结构化查询语言(关系数据库的通用查询语言,国际标准)作为组件技术的进一步发展,微软公司又于2002年推出了.NET框架,其中的核心技术就是用来代替COM组件功能的CLR(Common Language Runtime,公共语言运行库),可采用各种编程语言,利用托管代码来访问(例如C#、VB、F#、C+/CLI),使用的是.NET的框架类库FCL(Framework Class Library)。微软公司的各种组件技术之间的关系、发展与应用,可参见图16-6。ATL / MFC FCL / C#、VB、F#、C+/CLI开发 开发1981 1991 1993 1996 1999 2002DLLOLECOMDCOMCOM+.NET应用 应用 应用VBXActiveXDirectXASP.NET/ADO.NET/ Web服务替换 应用 分布式计算本地 网络 Web图16-6 微软组件技术的关系与应用16.2.3 组件的使用下面以具体的ActiveX控件媒体播放器为例,说明COM组件应用的功能强大和使用简便。媒体播放器(Media Player)是DirectX Media中的一个ActiveX控件,支持大多数标准(和微软公司自己的)流媒体格式的播放,如ASF、AVI、MPEG、WAV、MIDI、MP3、WMA等,但是不支持实网和苹果公司的RM和MOV格式。下面结合该例,介绍使用ActiveX控件的具体步骤。1添加ActiveX控件为了讲解媒体播放器控件的使用,我们创建一个基于对话框的MFC应用程序MPlay。为了能够在项目中使用媒体播放器控件,必须先将媒体播放器控件添加到对话框资源中(这需要在你的系统中,已经正确安装了微软公司的媒体播放器)。添加ActiveX控件的具体做法有两种:1)先在工具箱中添加ActiveX控件,再将其加入到对话框资源中打开工具箱窗口,在其空白区单击鼠标右键,在弹出菜单中选中“选择项”菜单项;也可以选VS的“工具选择工具箱项”菜单项;在弹出的“选择工具箱项”对话框中,选择“COM组件”页;滚动到列表框的底部,选中“Windows Media Player”项,按“确定”钮,关闭对话框。系统会将一个“ Windows Media Player”控件,加入到工具箱的对话框编辑器栏的底部。这样你就可以将其加入到对话框资源中了。参见图16-7和图16-8。 图16-7 为对话框编辑器工具箱添加“Windows Media Player”选项图16-8 “选择工具箱项”对话框2直接将ActiveX控件插入对话框资源你也可以简单地在对话框资源中单击鼠标右键,在弹出菜单中选中“插入ActiveX控件”菜单项;在打开的“插入ActiveX控件”对话框中,滚动列表框,选择底部的“Windows Media Player”项,按“确定”钮,关闭对话框,参见图16-9。则系统会将其自动加入到对话框资源中(但这样是不会在工具箱中添加对应控件的)。 图16-9 “插入ActiveX控件”菜单项和对话框2设计对话框在对话框中调整好媒体播放器控件的位置和大小,打开属性窗口,设置其ID为IDC_MP。在对话框中将原来的“取消”钮中的文字改为“退出(&X)”,将“确定”钮中的文字改为“装入(&L)”,并修改其ID为IDC_LOAD(用来打开文件对话框,选择播放的流媒体文件,并将该文件的路径名传递给媒体播放器),而播放、暂停、停止等图形按钮控件中已经有了,参见图16-10。如果希望运行时可以调整对话框窗口的大小,还需要将对话框窗口的“Border”属性的值从“Dialog Frame”改成“Resizing”。图16-10 MPlay对话框在你为对话框加入媒体播放器控件后,MFC会自动在资源文件MPlay.rc中添加对它的复杂初始化代码。还可以按属性窗口工具条上的属性页按钮,在弹出的“Windows Media Player属性”对话框(参见图16-11)中,进行各种属性设置,例如选中“按比例伸展”和“全屏播放”复选框。图16-11 媒体播放器的属性对话框3添加控件变量为了能使用媒体播放器控件,我们须在对话框类中为该控件添加一个控件型类变量(如:CMp m_ctrlMPlayer;),参见图16-12。图16-12 添加控件型类变量m_ctrlMPlayer系统会自动设定其类型为媒体播放器类CMp(类名由该控件的ID决定,如ID如果为IDC_MPLAYER,则类名为CMplayer),并会自动为项目生成和添加该(ActiveX控件包装)类的头文件mp.h和代码文件mp.cpp(这两个文件的命名,似类名也是由ID确定,但是可以自己修改)。这样你就可以使用该媒体播放器对象,来访问和控制媒体播放器了。4使用控件我们这里所要做的工作,只是在CMPlayDlg类中,为“装入”按钮添加单击事件BN_CLICKED的处理程序OnBnClickedLoad,并在该函数中打开公用文件对话框,获取用户选择的媒体文件名,并将该文件的路径传递给媒体播放器类对象:void CMPlayDlg:OnBnClickedLoad() CFileDialog dlg(TRUE, NULL, L*.*, OFN_FILEMUSTEXIST,LActive Streaming Format(*.asf)|*.asf|LAudio Video Interleave Format(*.avi)|*.avi|LMPEG-1 Audio Layer III(*.mp3)|*.mp3|LWave Audio(*.wav)|*.wav|MIDI File(*.mid)|*.mid|L所有文件(*.*)|*.*|);if (dlg.DoModal() = IDOK) / 伸缩画面,使其适合播放窗口/m_ctrlMPlayer.put_stretchToFit(TRUE);/ 可以在此进行各种其他设置/ 传递媒体文件到播放器m_ctrlMPlayer.put_URL(dlg.GetPathName();在该函数中设置了若干流媒体文件过虑器,创建打开文件公用对话框对象,让用户选择要播放的流媒体文件,并将该文件的路径通过调用CMp类的成员函数put_URL传递给媒体播放器。注意,媒体播放器控件有各种不同的版本,对应的函数名也可能有所不同(如有的版本叫SetUrl和SetStretchFit等)。如果找不到类似功能的函数,说明你系统中安装的媒体播放器控件有问题,可以从作者的个人网页上的res目录中下载mp.h头文件,用它替代你的同名文件。在打开媒体文件后,可以在播放器上单击右键,在弹出菜单中进行若干选择和操作,参见图16-12。还可以通过双击切换播放器到全屏状态。图16-13是程序运行的画面。 图16-12 媒体播放器的弹出菜单图16-13 媒体播放器界面16.2.4 COM与.NET.NET的核心是CLR(Common Language Runtime,公共语言运行库,参见图16-14),它可以视为是COM技术的继承和发展,它解决了COM组件模型中存在的主要问题。Web服务框架和库(ASP.NET、ADO.NET、Windows窗体)交互标准(SOAP、WSDL)开发工具(Visual Studio)组件模型对象模型和CLSCLR图16-14 .NET框架的分层结构1COM的缺陷COM(含DCOM和COM+)组件技术存在许多问题,其中有一些是关键的,有的甚至是致命的。组件技术主要强调在独立开发和部署的程序之间的一套约定(contract,契约),COM则是微软公司将这些约定规范化的首次尝试。COM既能作为设计范例(paradigm)(它将组件的约定表示为类型定义),也可用作支持平台技术。作为前者,COM编程模型相当成功;但是后者却存在诸多问题,正是由于缺乏稳固的平台技术,COM时代面临着终结。组件间的约定,纯粹是通过用户与组件之间的语义保证和假设的形式来表示的。但是,仍需要定义某种形式来表示语义,专业的做法是采用可编程的类型定义,以及描述这些类型定义的人工可读文档。COM用类型的形式表示组件约定,但是该约定存在如下两个关键问题,使得其对语义的表示并不是最优的。1)约定的描述COM没有定义约定的交换格式,即COM规范所约定的类型定义,必须通过完全是COM之外的某种技术来进行交互。微软定义和支持的COM交换格式有两个IDL(Interface Definition Language,接口语言定义)和TLB(Type LiBrary,类型库),但是这两种格式并不是同构的,其中也没有哪种格式是权威的或标准的。另外,COM的描述约定方式,至少还存在两个其他的关键问题: COM缺乏对组件依赖性的描述。因此,没有办法来解析COM组件(或者其约定的定义),也不能确定它所需要的其他组件,从而无法保证它的正确运行。由于缺少相关信息,使得部署基于COM的应用程序,很难确定它需要哪些DLL,也不能静态确定所需要的是哪个版本的组件,这让对版本问题的诊断变得极其复杂。 COM约定的描述格式缺乏扩展性。IDL是基于文本的,极少随组件部署,通常只有C+程序员才会使用。但是,在MTS下开发企业应用的C+程序员很少,这使得IDL约定用处不大。TLB在扩展性方面存在缺陷,而且VB与TLB/MTS之间被隔离开来,这最终导致了TLB的没落。2)约定的工作方式COM组件的约定是基于类型描述的,所采用的类型系统是C+的可移植子集。而且COM对组件的约定是物理的(二进制约定)。它要求:每个方法都具有精确的虚函数表vtable偏移量、每个被传递的参数在堆栈规则中都有明确的偏移量、对象引用采用接口指针的明确格式、使用规定的分配器进行被调用这内存分配。就底层技术而言,COM组件的约定,最终只是在内存中形成堆栈结构的协议,根本没有(按组件所要求的那样来)描述语义内容。二进制的物理约定,过度关心细节,使COM难于使用和开发。尤其在针对COM组件的版本控制问题上,物理性约定所产生的问题就更大了。这使得COM组件,难以进行语义修改和版本升级。COM组件的约定定义的精确性,产生了高效的代码,但这却是以难以接受的不可靠性和开发使用及扩展升级的困难与复杂性为代价的。2CLR与CLI为了解决COM所存在的这些问题,微软公司的COM和MTS小组,计划开发一个新的组件平台。开始时叫COM3或COM+ 2.0,后来又叫COR(Component Object Runtime,组件对象运行时)和URT(Universal Runtime,通用运行时),最后才被命名为CLR(Common Language Runtime,公共语言运行时/库)。它是现在(由微软提交的)成为国际标准的CLI(Common Language Infrastructure,公共语言基础结构)在Windows平台上的一种具体实现。CLI是针对可执行代码格式、以及能执行该代码的运行时环境的一种规范。CLI标准包含如下几个主要组成部分:l CTS(Common Type System,公共类型系统)被编译器、工具和CLI本身所共用的一种统一类型系统。 它是一个模型,定义了在声明、使用和管理类型时,CLI应遵循的规则。CTS建立了一个框架,使跨语言集成、类型安全和高性能的代码执行成为可能。l CLS(Common Language Specification,公共语言规范)语言设计者和框架(类库)设计者之间的一种协定(agreement)。它指定了CTS的一个子集和一个用法常规(usage conventions)集。l metadata(元数据)描述和引用CTS所定义类型的数据。元数据被以一种独立于任何特定的程序设计语言的方式存储。从而,元数据为操作程序的工具(如编译器和调试器)之间,以及这些工具和VES之间提供了一种公共交换机制。l VES(Virtual Execution System,虚拟执行系统)该系统实现和实施CTS模型。VES负责装入和运行为CLI编写的程序。它在运行时,利用元数据将分开产生的模型连接在一起,并为执行托管代码和数据提供所需要的服务。VES也被称为执行引擎,功能与Java的虚拟机JVM类似。l CIL(Common Intermediate Language,公共中间语言)可被VES理解的指令集,也被称为MSIL(微软IL),与Java的字节码类似。程序集(Assembly,装配/汇编)就是CLR中的组件,它是一种功能上不可分割的逻辑单元,由一个或多个模块(module,DLL或EXE文件)组成。大多数程序集就是一个DLL,所以程序集也被称为“托管DLL”。每个程序集中有一个程序清单(manifest),它包含了程序集内所有模块和其他文件的信息,如程序集的名称、版本号、文化和语言、程序集包含的所有文件列表、程序集所依赖的其他程序集等。程序集中自然包含了若干CLR类的(MSIL中间语言)代码,同时还包含了这些类的元数据,参见图16-15。程序集中的元数据(metadata)描述模块中类型的相关信息,如类型的名称、类型的可见性(public或assembly)、基类、实现的接口和方法、暴露的属性、提供的事件等。清单类X的代码类Y的代码类Z的代码类X、Y、Z的元数据app1.dll程序集A清单类P的代码类Q的代码类P、Q的元数据app3.dll程序集Bapp2.exe类R的代码类R的元数据图16-15 程序集示例3CLR与COM与COM相比,CLR的组件技术有了质的飞跃,前面提到的各种COM问题都迎刃而解、一扫而光。1)相同点约定(类型)与COM平台一样,CLR也注意组件间的约定,而且这些约定也是基于类型的。注意,组件技术里的类型是广义的,除了包括字符、布尔、整数和浮点数等基本数据类型之外,还包括类、结构、接口、串、数组、枚举、委托(delegate,指向方法和函数的安全指针,用于事件处理和回调)等高级结构类型。2)不同点1约定的描述(元数据)但是与COM(没有标准格式来描述约定)不同的是,CLR有完全规范的格式来描述组件之间的约定元数据(metadata)。CLR的元数据是机器可读的,其格式是公开的、国际标准化的、完全规范的。CLR还提供了读写元数据的实用工具,使用者不需要了解元数据的底层文件格式。COM的元数据(IDL和TLB)难以定制和扩展;而且其元数据中又缺少依赖和版本信息,使得对组件的部署和版本的控制都十分困难;另外,COM元数据的存在是可选的,而且经常会被忽略掉,这对组件应用的构建会造成很多问题。CLR通过定制(本身就是强类型的)特性(attribute),使其元数据可以达到清晰容易的可扩展性。CLR元数据中还包括组件的依赖关系和版本信息,从而允许使用新技术来处理版本控制问题。另外,CLR元数据的存在是强制性的,部署或加载组件都必须访问元数据。因此,构建基于CLR的基础架构和各种工具,显然要比COM容易的多。3)不同点2约定的类别(逻辑结构)CLR约定与COM约定的第二个主要差别,是约定本身的特性。在COM中,组件的(二进制物理)约定隐含了:堆栈约定、虚函数表和(作为方法参数传递的)数据结构在内存中的表示形式。在CLR中,约定被描述为类型的逻辑结构,而不是物理的二进制格式。因此,在CLR的约定中,并没有暗示访问字段和方法的精确代码顺序。所以,在考虑虚方法布局、堆栈规则、对齐方式、以及参数传递方式时,CLR具有极大的灵活性。CLR是通过名字和签名来引用字段与方法,而不是偏移量。这样,CLR就避免了困扰COM的声明顺序问题,组件成员的实际地址/偏移量,需要等到运行时在类型被加载及初始化时,才能够确定。另外,CLR(.NET框架)版本的改变,也不会带来组件的重新编译。4)不同点3CIL实现数据表示形式和方法地址的虚拟化,需要延时对约定的物理方面(如方法表和字段偏移量等)的解析,这就要求组件中不含具体的机器代码。基于CLR的组件,通过采用CIL(Common Intermediate Language,公共中间语言)而实现了这一要求。CIL是一组与处理器无关的指令集,它具有抽象能力将与机器代码密切关联的物理数据的表示形式抽象出来。CIL使用的操作码在访问字段和调用方法时,不再使用绝对地址和偏移量,而是利用元数据进行基于名字和签名的引用。CIL会在(第一次被)执行前被翻译成本地的机器语言,CLR执行的是由CIL生成的本地代码。而CLR在CIL杯翻译成本机代码之前,是不会解析其物理绑定的细节的。由于翻译工作是在部署机器上进行的,所以,组件所需的外部类型定义,将与部署机器上的某个类型匹配,而不是开发者的机器。这极大减少了跨组件约定的不可靠性,同时又不会降低代码的运行性能。另外,由于CIL到机器代码的翻译,发生在部署的机器上。所以,任何用到的待定处理器布局或对齐规则,都将与(代码将在其上面运行的)目标处理器架构相匹配。现在,软件正面临着一次重大的处理器迁移,即从IA-32/Pentium和AMD32架构向IA-64/Itanium和AMD64架构的发展。对于这次升级,CLR显得尤为重要。5)COM向CLR过渡鉴于COM技术已经被使用多年,有许多现存的资源,程序员和用户也不可能一下子就全部完全转换到.NET环境。因此,微软公司也允许在CLR环境中继续使用COM/DCOM和 COM+等,这可以通过.NET框架的 System.EnterpriseServices 命名空间来进行。但是鉴于与COM相比,CLR组件所具有的无比优越性。COM技术必然会走向灭亡,而.NET的CLR终将取而代之。16.3 .NET框架.NET框架(.NET Framework)是微软为Windows平台设计的一种托管编程模型。这里的托管(managed)是指,程序的代码(元数据、MSIL),特别是程序中的数据和对象所对应内存的分配、指向和释放,全都由.NET的运行环境CLR来代为管理。换句话说,程序员在托管程序中,是不能自己来具体分配和手工释放内存对象的。之所以必须这样,是因为.NET/CLR为了安全和方便,(似Java)具有内存垃圾自动回收功能(包括根据需要,移动内存中的数据和所对应的指针。所以,在远堆的托管内存中,再也不存在传统意义上的指针了),不让程序自己管理内存。托管是所有.NET程序的特点。托管代码的优点有:跨平台运行、跨语言集成、共享FCL(框架类库)、跨语言异常处理、增强的安全性、版本控制和部署支持、简化的组件交互模型、调试和分析服务等。16.3.1 版本.NET框架的版本有:l .NET Framework 1.0:2002年1月5日推出,随Visual Studio .NET(2002)于2002年2月13日发布。为.NET框架的首个版本,含.NET框架的基本功能,主要由CLR、FCL和ASP.NET三部分组成。l .NET Framework 1.1:2003年4月1日推出,随Visual Studio .NET 2003于2003年5月20日发布。为1.0的升级版,增加了对内置ASP.NET控件和内置ODBC与Oracle数据库的支持、改变了安全性(允许以半可信方式执行视窗窗体程序集Windows Forms assemblies、允许在ASP.NET应用程序中的代码访问安全性)、增加了针对小型设备的紧凑版框架(.NET Compact Framework)、增加了对IPv6的支持、还改变了许多API。l .NET Framework 2.0:2005年11月7日推出,随Visual Studio 2005一起发布。在2.0版中,新增了一个针对本地应用程序的可更精细地控制多线程/内存分配和程序集装入的宿主(hosting)API、将对泛型(Generics)的语言支持被直接植入CLR中、提供了对AMD的x64和Intel的IA64等64位硬件平台的全面支持、许多新增和改进的ASP.NET Web控件以及新的ASP.NET个性化特征(如支持主题(themes)、外壳(skins)和网件(webparts)等)、增加了许多ADO.NET 的新功能(包括对用户定义类型 (UDT)、异步数据库操作、XML 数据类型、大值类型和快照隔离的支持,以及对允许应用程序通过 SQL Server 2005 支持多活动结果集 (MARS) 的新属性的支持等)、增加了与聪明个人对象技术(Smart Personal Objects Technology)有关的微型版框架(.NET Micro Framework)。l .NET Framework 3.0:2006年11月6日推出,随Windows Vista一起

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论