** .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 <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hans