摘要:发现 Microsoft .NET 比 Java 优越的地方,学习如何将 Java 应用程序转换到 .NET。
什么是 .NET?
Microsoft? .NET(读作“dot net”)既是软件编写方法,又是一套开发实现这些方法的软件的工具。我们来看一些有关连接性和互操作性的常见业务问题,以说明促使 .NET 方法的发展的原因:大多数企业都与其他企业合作,但是它们的信息系统运作却是孤立的。没有建立起贯穿供应商的产品供应链;供应商与买方之间的联系常常只局限于传真或简单的文本文件交换。人们通常将这一点看作提高生产率的障碍。更好地沟通可以使企业实现更高的效率。当供应链中的所有供应商都彼此连接起来时,每个供应商都能够将库存降低到最低水平、根据需求生产和更有效地协调。
与此相关的是互操作性问题。当企业承诺互相连接起来时,如果他们的操作系统处于不同的再开发状态或处于不断变化中,他们就会面临艰难的设计及实现连接的策划工作。此外数据安全也是个复杂问题,因为通过企业防火墙与其交换数据的既是合作伙伴又是竞争对手。
.NET 方法能更好地启用这种能力,它使得编写能够在任意时间、任意地点和任意设备上安全地彼此连接和互操作的系统变得非常简单。实现这一点的核心技术是 XML Web Service。这项技术既是一种方法,也是在不同机器、不同网络及不同操作系统的组件之间传递信息的传输层。
XML Web Service 得到了广泛的支持。许多公司已经使用 XML Web Service 与合作伙伴连接。Microsoft 正在所有产品上加大对 XML Web Service 的支持。从开发人员的角度看,.NET 使得利用 Microsoft Visual Studio .NET、.NET Framework 以及 XML Web Service 编写彼此连接的系统变得非常简单。
.NET Framework
.NET 绝不仅仅是 XML Web Service。.NET 的核心是 .NET Framework,它由公共语言运行库和类库组成。这两个组件为构建 .NET 应用程序提供了执行引擎和编程 API。
为 .NET 编译的应用程序不是被直接编译成本机代码,而是被编译成一种称为 Microsoft 中间语言 (MSIL) 的中间语言。当首次运行一个应用程序时,公共语言运行库实时编译器在程序执行前将 MSIL 代码编译成本机代码。公共语言运行库不是一个简单的 JIT 编译器,它还负责提供内存回收、异常处理、安全服务、运行时类型安全检查等底层执行服务。由于公共语言运行库在管理执行方面的作用,因此有时将以 .NET Framework 为目标的程序称为“托管”应用程序。
.NET Framework 是一组类,它们用于构建在公共语言运行库上运行的应用程序。这些类库为包括数据访问、安全性、文件 IO、XML 操作、消息传送、类反射、XML Web Service、ASP.NET 和 Microsoft Windows 服务在内的各种任务提供强大的支持。
也许 .NET 最独特的属性是它的多语言支持。Microsoft 已经为 .NET Framework 发布了四种商业语言:Visual C#? .NET、Visual Basic? .NET、C++ 托管扩展及 Visual J# .NET。许多其他兼容 .NET 的语言也正在开发中,其中包括 Perl、Python 及 COBOL。
为了帮助创建兼容 .NET Framework 的语言,Microsoft 设计了公共语言规范 (CLS)。每种语言要使用 .NET Framework 和公共语言运行库,以及与用其他语言编写的组件进行互操作,就必须提供 CLS 所描述的功能。如果一种语言实现了必需的功能,那么它就被称为兼容 .NET。每种兼容 .NET 的语言都支持相同的数据类型,使用相同的 .NET Framework 类,编译为相同的 MSIL,并且使用相同的公共语言运行库管理执行过程。因此,各种兼容 .NET 的语言之间没有优劣之别。开发人员可以自由地为特定的组件选择最好的语言同时又不损失该平台的能力和自由度。另外,使用一种语言编写的组件也能够很容易地与用另外一种语言编写的组件进行互操作。例如,您可以用 C# 编写一个从用 Visual Basic 编写的基类继承而来的类。CLS 已经被提交给 ECMA 进行标准化,这鼓励许多语言开发人员为许多语言创建兼容 .NET 的版本。在撰写本文时有 20 多种兼容 .NET 的语言正在开发中。
图 1 展示了在操作系统之上的各种 .NET 组件。.NET Framework 由四个蓝框组成,这些蓝框分别代表 ASP.Net、Windows 窗体、ADO.NET 和 XML 以及子组件。
Visual Studio .NET
为了能够进行 .NET 开发,Microsoft 重新编写了其开发工具并重新将其组合为 Visual Studio .NET。Visual Studio .NET 支持使用一种或多种语言开发应用程序。设计、开发、调试和部署 .NET 组件均使用同一个集成开发环境 (IDE)。
这个开发环境支持控制台应用程序、Windows 应用程序、DLL、Web 应用程序、XML Web Service 以及手持设备应用程序的开发。该开发环境提供了一些独特的高生产率功能:智能感知;针对 Web 窗体、Windows 窗体、XML 架构及数据的可视化设计器;可以无缝地从用一种语言编写的代码转到用另一种语言编写的代码的跨语言调试器;与 .NET Framework 的紧密集成;能在键入时持续提供上下文相关帮助的动态帮助;显示编译器错误以及任务的任务列表;体系结构设计功能,例如 Visio 集成,以及用于可视化访问数据库的服务器资源管理器、Windows 服务、性能计数器和服务器端应用程序组件。
Microsoft Visual Studio .NET 是一个获奖的开发工具。到撰写本文时,Visual Studio .NET 已经获得了多种奖项,其中包括两次 2002 SD Magazine 效率奖和 PC Magazine 的 2001 年度卓越技术奖(尽管该产品当时仍处于 Beta 阶段)。
比较 .NET 和 Java
在经验丰富的 Java 开发人员看来,.NET 可能与 Java 平台很相似,它们都提供了一种创建应用程序的结构化方法,都有编译为中间代码的语言,都为应用程序开发提供了一个大型 API 库。但实际上,.NET 的核心有一套与 Java 平台不同的目标。
从概念上讲,Java 是两样东西:Java 平台(运行时和 API)和 Java 语言。Java 平台的用途是支持用 Java 语言编写并被编译为 Java 字节码的应用程序。尽管进行了许多试图将其他语言编译为 Java 字节码的工作,但是这些工作大部分都是学术活动。Java 的理想目标一直是“在多种平台上使用一种语言”。
.NET 也是两样东西:.NET Framework(运行时和 API)和大量支持它的编程语言。.NET Framework 的用途是支持用任一种语言编写并被编译为 MSIL 的应用程序。.NET 的目标是“多种语言共享一种平台”。
.NET 与 Java 相比的优点
与 Java 相比,除了语言自由度之外,.NET 还有许多其他优点。下面总结了一些最重要的优点:
框架类
由于 Java 是多平台的,因此传统上其框架类被局限于那些所有平台都提供的类。这影响了类的范围和丰富度:类的范围被局限于可用计算机和操作系统最通用的类。另外还影响了类本身的丰富度。内建 Java 类一般都非常简单,开发人员常常在它们上面构建自己的框架或不得不寻找 XML 文件语法分析等第三方框架。在发行 JDK 1.4 之前必须使用第三方库或编写自己的语法分析程序来对 Java 中的 XML 文件进行语法分析。编写自己的语法分析程序通常需要 100 多行代码。
.NET Framework 构建于 Windows 平台之上。还有一个用于 FreeBSD 的公共语言运行库和 .NET Framework 类库版本。这些类包括了该平台上的所有框架类。另外,这些类也比 Java 所能提供的类更丰富。.NET 提供了一个编程框架而不是一个构建编程框架的基础。
下面的 C# 例子说明在 .NET 中如何对 XML 文件进行语法分析。注意,.NET Framework 中已经提供了辅助类。这使得代码编写非常简单:
XmlTextReader myXmlTextReader = new XmlTextReader ("textToValidate.xml");
XmlValidatingReader myReader = new XmlValidatingReader(myXmlTextReader);
myReader.Schemas.Add(myXmlSchemaCollection);
myReader.ValidationEventHandler += new ValidationEventHandler (this.ValidationFailureHandler);
// 读取 XML 数据。
while (myReader.Read()){}
.NET Framework 的保真度比 Java 平台高。.NET 程序可以使用 Windows 的所有功能,而不象 Java 那样只能使用 Windows 最通用的功能。
“……真正的底线是:.NET 方法意味着 Microsoft 提供了 90% 以上开发人员都可能需要的符合标准的工具,而 Java 方法仍然意味着从各种来源搜集而来的各种碎片组合成的一个解决方案。”
一次编写,到处调试
尽管 Java 的“一次编写,到处运行”的理想很有吸引力,但是现在编写的大多数应用程序都仅针对一个操作系统。造成这种情况的技术原因有两个:由于 Java 框架在范围和丰富度上受到局限,因此开发人员常常使用专有类来访问目标平台的可用功能。第二,由于各种 Java 执行程序之间无法消除的不兼容性继续给真正的跨平台工作带来困难,因此开发人员必须在想要支持的所有平台上测试代码。因此,有些开发人员半开玩笑地将 Java 称为“一次编写,到处调试”的平台。
安全性
.NET 的安全功能更丰富。除了加密 API、安全 cookie 和身份验证之外,.NET 还是一个能够根据代码来源给不同用户群分配不同权限等级的丰富的可扩展机制。例如,所有来自 Microsoft 的代码都被看作是安全的。可以允许或禁止所有来自特定 URL 的代码读/写临时目录或屏幕等特定资源。另外,应用程序可以被标志为需要某种权限(例如需要访问文件系统)。如果没有这些权限,那么该应用程序就不会被加载。由于安全检查是在加载时进行的,因此开发人员不必在整个应用程序中编写安全失败检查逻辑。这一点是通过一项称为“代码访问安全”的新技术管理的,这种技术对从 Internet 或本地机器加载的代码都有效。
版本控制
.NET Framework 有一个比 Java 更强大的版本控制系统。在 Java 中