.Net开发平台研究(一
2024-07-10 13:07:38
供稿:网友
.net开发平台研究
总结:
.net开发平台的发布标志着近十年来微软开发平台第一个重大的转变。这个开发平台包括一个用于加载和运行应用程序的新的软件基础结构(.net framework和asp.net),一个新的开发环境(visual studio .net),以及支持该结构的编程语言。
微软希望随着这个新平台的发布,评论不再将这个平台作为朦胧的软件,而且开发者也将发现该平台使得windows上web应用程序(尤其是web service)的开发更为容易。这样或许会使更多的开发者拥护公司的操作系统和服务器产品,并将他们从与java平台的竞争中吸引过来。
微软的客户可以将该平台用作应用程序的更可靠、更安全和更统一的标准,而微软的合伙伙伴则可以通过帮助为该平台创建早期的胜利来加强与公司的联系。不过,无论是客户还是合伙厂商都应该意识到,新的平台要求他们从根本上掌握新的应用程序编程接口和编程语言,而且它能将他们锁定在微软的操作系统和服务器产品上。
1. 名词简介:
微软发布了.net开发平台,这是自1993年7月随着windows nt3.0出现的win32 api后微软软件开发平台的第一次大升级。比起win16来,win32提供了更多功能强大的api,但没有对工具和技术进行引人注目的改变。与之不同的是,.net开发平台在开发者用以创造应用程序的工具和技术上做了根本的改变。
.net开发平台使得开发者创建运行在internet information server (iis)(互联网信息服务器)web服务器上的web应用程序更为容易,它也使创建稳定、可靠而又安全的windows桌面应用程序更为容易。.net开发平台包括以下内容:
·.net framework(架构),包括:common language runtime(clr)(通用语言运行环境),这是用于运行和加载应用程序的软件组件;新的类库,分级组织了开发者可以在他们的应用程序中用来显示图形用户界面、访问数据库和文件以及在web上通信的代码集。
·.net开发者工具,包括:visual studio .net integrated development environment (ide)(visual studio .net集成开发环境),用来开发和测试应用程序;.net编程语言(例如visual basic .net和新的visual c#),用来创建运行在clr下并且使用类库的应用程序。
·asp .net,一个取代以前的active server pages (asp)的特殊类库,用来创建动态的web内容和web服务器应用程序,这些都将采用诸如html、xml和simple object access protocol(soap)(简单对象访问协议)等internet协议和数据格式。
(有关该平台组件的概貌,请参看“.net开发平台”示意图。)
2. 微软为什么需要一个新的开发平台?
微软希望能够藉此平台保留住它庞大的windows开发用户的基础,否则由于java向开发者所做的硬件与操作系统(oss)无关性的承诺,这些用户群可能会转向其它的平台。开发者本身不会给微软(或任何其他针对此事的公司)带来很多收益。不过,windows程序员是公司内对微软产品(例如windows本身)的极大的支持力量,而商用软件的开发者形成了向客户发售微软产品的重要渠道。如果微软可以让开发者在新的.net开发平台下写应用程序的话,那么就会有更多的公司购买windows server和.net enterprise server (.net企业服务器),包括sql sever 、exchange 、share point、commerce server以及biztalk等。
微软尤其推重.net开发平台用于开发一种新型的应用程序:web services, 或者和web上其他应用程序交换xml格式数据的服务器应用程序。(有关web services的概貌,请参看“web services:是什么与为什么”。)微软认为web services(为此公司已注册了名为“xml web services”的商标)是公司将现有的、孤立的应用程序集成到更大的商务(以及b2b)系统中的一种成本低而效用高的方法。微软希望web services成为吸引程序员在新的平台和产品上开发的“必有”的应用程序类型,正如带有图形用户界面的桌面应用程序吸引程序员在早期版本的windows上进行开发那样。微软本身也计划使用该平台开发它自己的公共web services(称作.net my services),它将给internet上的客户提供数据存储以及其他的功能。
.net开发平台
.net开发平台是一组用于建立web服务器应用程序和windows桌面应用程序的软件组件,用该平台创建的应用程序在common language runtime(clr)(通用语言运行环境)(底层)的控制下运行。clr是一个软件引擎,用来加载应用程序,确认它们可以没有错误地执行,进行相应的安全许可验证,执行应用程序,然后在运行完成后将它们清除。类库集提供了使应用程序可以读写xml数据、在internet上通信、访问数据库等的代码。所有的类库都建立在一个基础的类库之上,它提供管理使用最为频繁的数据类型(例如数值或文本字符串)的功能,以及诸如文件输入/输出等底层功能。
web服务器应用程序通常依赖于asp.net,一个处理web请求的服务器端的库。asp.net又依赖一个用于发送和接收soap信息的web services库,以及一个用于以浏览器接收用户输入并动态地生成web页面以示响应的web用户接口(ui)(有时称作web 表单)。windows桌面应用程序通过使用win表单库(也称作windows 表单)可以显示一个图形ui。
最后,visual studio .net提供了一个用于在该平台上创建应用程序的图形integrated development ewironment(ide)(集成开发环境)。程序员可以使用一种或多种.net编程语言,来编写他们的代码,例如微软自己的visual basic .net(vb.net),visual c++, visual c#和jscrjpt .net等。大量其它的.net编程语言可以从第三方厂商获得。
.net framework核心:
所有在.net开发平台上创建的应用程序运行都需要运行两个核心块:
common language runtime(clr)(通用语言运行环境),这是一个软件引擎,用来加载应用程序,确认它们可以没有错误地运行,进行相应的安全许可验证,执行应用程序,然后在完成后将它们清除。
.net framework类库,向程序员提供所需用来编写在clr的控制下运行的代码的软件组件。它们按照单一有序的分级组织提供了一个庞大的功能集——从文件系统到对xml功能的网络访问的每一样功能。
web服务器应用程序也可以使用asp .net,这个类库将在做详细解释。桌面应用程序不需要asp .net。
clr有两个主要的目标:
·提高应用程序的稳定性和安全性
·减少应用程序开发者所必须写的冗长而又易出错的底层代码的容量
这两个目标类似于诸如sun和ibm等厂商试图用unix和主机上的java平台去解决的问题。为了解决windows上的这些问题,clr对加载和执行应用程序的编程模型做了根本的改变。
3. web services:是什么与为什么
web services是一个软件组件,它通过将消息以xml格式进行编码,并将消息通过标准的internet协议(例如hypertext transfer prorocol (http)(超文本传输协议))发送出去来与其它的应用程序进行通信。一个web services类似于这样一个web站点:没有用户接口,向应用程序而非用户提供服务。web services不从浏览器获得请求并返回相应的web页面,而是从应用程序接收xml格式的请求消息,执行任务,然后向应用程序返回xml格式的响应消息。
ibm和微软一致提倡将soap作为一种用于web services的消息标准。一条soap消息如同一封信,由一个基于xml格式的“信封”和载有消息数据的“正文”两部分组成,“信封”部分包含一个指明消息接收者地址的头部和一系列投递选项(例如加密信息)。
(微软喜欢将此编程模型称作“xml web services”——采用“xml”意在强调其开放性。——但是这个基于一套world wide web consortium (w3c)协议标准的模型,业界习惯上简单称其为“web services”。)
微软和ibm等其他供应商提倡将web services作为用于internet上的互连应用程序通信的程序设计模型。这些公司相信通过internet相互连接的应用程序,将增强与它们的合作供应商和客户协同工作的商务能力。通过在一个现有的公司应用程序的顶层创建一个web services层,各个组织可以允许外部系统通过internet(或企业intranet)调用应用程序的功能,但却不必修改应用程序本身。例如,有几家公司正在创建web services,来充当驻留在主机内的订单一入口应用程序的前端,这允许客户的订货系统通过internet提交订单。作为公司内整合由各个部门独立开发的应用程序,以降低伴随公司合并与购并而来的it整合费用的方法,将web services放在现有应用程序的顶层相当重要。
微软也希望使用web services进入服务供应商领域,通过internet向付费客户提供必要的服务。计划中的服务首要的是.net my services,一套由微软管理的数据存储web services,包括由单个用户输入的个人信息,例如信用卡号和日历安排。桌面和web服务器应用程序,如果获得了用户的许可,将通过web services协议从那些internet上的数据库中取回信息。
4. clr如何工作?
一个应用程序是作为称作汇编的文件或文件集进入clr的。这个汇编包是microsoft intermediate languagl (msil)代码,clr将其翻译成可执行的本机代码。由于可以对从msil到本机代码的应用程序翻译的控制,使得clr可以管理应用程序的执行并且防止各种问题的发生,因此也就有了术语可控制代码。
除了msil代码,汇编还包含有详细描述了msil代码正确执行所需的各种相关数据类型的元数据。最后,汇编还包括一个清单——一个列出了汇编中所有文件和软件组件的文档,该文档还指出clr在哪里可以找到具有应用程序运行所需组件的其它汇编。
为了加载一个应用程序,clr使用汇编的清单来确定应用程序所需的汇编的正确版本。然后clr检查应用程序的全部汇编——即,msil代码本身与描述它的元数据——从而确认代码是“类型安全”的,这表明它只执行对恰当数据类型的恰当的操作(也就是说,它不会允许开发者使用一个整数作为一个函数指针),而且它只访问经过授权可以访问的内存位置。
接下来clr加载应用程序的汇编中的msil,并且在此过程中,收集有关汇编的“证据”,例如:
·它是从哪里下载或安装的
·它需要执行什么功能(也就是说,它是否需要写文件或发e-mail)
·什么用户试图运行它
· 汇编是否拥有来自信任的开发者的数字签名,以及进行数字签名后汇编是否有改动。
执行控制代码
common language runtime (clr)(通用语言运行环境)组件(以灰色显示)加载并运行应用程序。
(1)class loader(类加载器)将应用程序的汇编加载到内存中。汇编包括microsoft intermediate language[msil]代码、描述应用程序的汇编中的软件组件的元数据,以及其他应用程序所需的组件。
接下来,class loader使用应用程序汇编的元数据,试图加载任何应用程序所需的组件的支持汇编。例如,它可能加载包含一个桌面应用程序所需的图形用户接口(gui)控制的汇编。class loader 使用versioning polily(版本政策)(由应用程序的开发者或者系统管理员指定)采确定加载它所支持的哪些版本汇编。例如,一个versioning policy可能要求只能使用特定版本的gui组件,即使有更多最近的版本可以利用。这消除了组件版本问题,这样的问题在过去十分普遍地存在于windows应用程序中。
(2)一旦应用程序和受支持的汇编加载后,verifier就得检查它的内容以确保它是类型安全的(type-safe),并且确定对于应用程序适当的安全许可。这是加强安全过程的第一步。
(3)本机编译器将msil转换为可控制的本机代码,这是处理器相关代码,它知道如何与clr提供的服务,例如碎片整理(声明内存不再为应用程序所用)或clr安全系统(将增强应用程序的安全许可),进行行交互。
这些证据构成了.net framework中的安全要素,使得clr可以判断是否运行应用程序,以及运行时需要具有什么许可。
接下来,clr将msil代码翻译成处理器可以执行的本机代码。(微软将此称为“可控制的本机代码”,以与“不可控制的本机代码”相区分,后者是用c++这样较老的语言写的,clr对其没有控制。)一项称为just-in-time(jit)编译的能力使得clr能将翻译过程延迟至真正需要它时,这样就使clr避免翻译不常用的代码。(关于这个过程的图解说明,请参看 “执行可控制代码”示意图。)
最后,clr监控着翻译代码的运行,并且定期清空应用程序释放的内存(使用一个称作“碎片整理”的进程)。
clr的好处:
clr通过下列方法增强了应用程序的可靠性:
它减少了不同版本组件间的冲突。clr可以帮助避免在一台机器上安装相冲突的软件组件时发生的问题——现在的windows应用程序如果试图加载不正确版本组件时可能失败。当crl加载一个应用程序时,它使用元数据和汇编清单来确保它加载了所有组件的正确版本。例如如果应用程序需要访问数据库,clr就使用清单中的信息来寻找并加载版本正确的数据访问组件。系统也允许并列安装多个版本的组件。
它减少了由于通常的编程错误所带来的bug和安全漏洞的数量。clr监控代码以确保它不会有通常的编程错误,这些错误可能导致程序执行不正确的功能,例如试图使用一个整数作为函数指针,强行将数值型数据存放到分配给文本数据的位置,或者是载入数据时覆盖代码(由于缓冲溢出)。减少来自这些通常的编程错误的bug意味着应用程序不但运行得更可靠,而且攻击者有机可乘的漏洞和弱点也更少。
增强的安全性能使恶性代码的运行更为困难。因为clr可以理解每个应用程序的代码的身份和来源,所以它可以决定应用程序是否被允许执行特定的任务(例如读写本地存储器或者发送e-mail)。这给现在的安全模型增加了另外一层保护,在现在的安全模型中应用程序在运行它的用户帐号的安全背景下运行(例如,管理员机器上所有的应用程序都用管理员级的许可在运行)。
内存泄漏更少。如果内存和组件分配给一个应用程序使用,但却得不到释放,这样就会导致系统超出内存运行,要么会冲击系统,要么就需重新启动、释放内存。clr的内存管理和碎片整理可大大降低这种问题发生的可能性。
组装函数(plumbing functions)减少了bug,同时也节约了开发者的时间。最后,clr提供了许多与内存和对象管理、数据编组,以及线程(thread)相关的低级的,或组装函数。这不仅通过降低bug的发生可能性而建立了更好的可靠度,而且还使得程序员能将精力集中于用于他们特定的应用程序的“行业”代码上,而不必重新实现标准的windows函数。
从windows的过渡
最后,clr执行的一项非常重要的功能是在可控制代码和不可控制代码(即脱离clr运行的传统的windows代码)间起中介作用。特别地,它使开发者可以将新的.net代码与现存的windows库和com组件结合起来,并将一个应用程序逐渐地从老平台迁移到新平台上来。(请参看“混合可控制代码与不可控制代码”示意图)。
不过,需要指出的是,不可控制代码脱离clr的控制而运行,因此有可能冲击应用程序,泄露内存,或者通过缓冲溢出打开安全漏洞。一个.net应用程序只是和它的最弱环节——它的不可控制代码一样强壮。
类库统一windows api