将 Java 应用程序迁移到 .NET 摘自微软网站
将 Java 应用程序迁移到 .NET 摘自微软网站 将 Java 应用程序迁移到 .NET 将 Java 应用程序迁移到 .NET
2002 年 6 月
适用于:
Microsoft .NET
摘要:发现 Microsoft .NET 比 Java 优越的地方,学习如何将 Java 应用程序转换到 .NET。
请从 MSDN Code Center(英文)下载 MigratingJavaApplicationsCSharpDemo.msi 和 MigratingJavaApplicationsJSharpDemo.msi。
目录
什么是 .NET?比较 .NET 和 Java如何将 Java 应用程序迁移到 .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 绝不仅仅是 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 以及子组件。
为了能够进行 .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 阶段)。
在经验丰富的 Java 开发人员看来,.NET 可能与 Java 平台很相似,它们都提供了一种创建应用程序的结构化方法,都有编译为中间代码的语言,都为应用程序开发提供了一个大型 API 库。但实际上,.NET 的核心有一套与 Java 平台不同的目标。
从概念上讲,Java 是两样东西:Java 平台(运行时和 API)和 Java 语言。Java 平台的用途是支持用 Java 语言编写并被编译为 Java 字节码的应用程序。尽管进行了许多试图将其他语言编译为 Java 字节码的工作,但是这些工作大部分都是学术活动。Java 的理想目标一直是“在多种平台上使用一种语言”。
.NET 也是两样东西:.NET Framework(运行时和 API)和大量支持它的编程语言。.NET Framework 的用途是支持用任一种语言编写并被编译为 MSIL 的应用程序。.NET 的目标是“多种语言共享一种平台”。
与 Java 相比,除了语言自由度之外,.NET 还有许多其他优点。下面总结了一些最重要的优点:
由于 Java 是多平台的,因此传统上其框架类被局限于那些所有平台都提供的类。这影响了类的范围和丰富度:类的范围被局限于可用计算机和操作系统最通用的类。另外还影响了类本身的丰富度。内建 Java 类一般都非常简单,开发人员常常在它们上面构建自己的框架或不得不寻找 XML 文件语法分析等第三方框架。在发行 JDK 1.4 之前必须使用第三方库或编写自己的语法分析程序来对 Java 中的 XML 文件进行语法分析。编写自己的语法分析程序通常需要 100 多行代码。
.NET Framework 构建于 Windows 平台之上。还有一个用于 FreeBSD 的公共语言运行库和 .NET Framework 类库版本。这些类包括了该平台上的所有框架类。另外,这些类也比 Java 所能提供的类更丰富。.NET 提供了一个编程框架而不是一个构建编程框架的基础。
下面的 C# 例子说明在 .NET 中如何对 XML 文件进行语法分析。注意,.NET Framework 中已经提供了辅助类。这使得代码编写非常简单:
.NET Framework 的保真度比 Java 平台高。.NET 程序可以使用 Windows 的所有功能,而不象 Java 那样只能使用 Windows 最通用的功能。
Pull Parsing in C# and Java, http://www.xml.com/pub/a/2002/05/22/parsing.html?page=1(英文)。 尽管 Java 的“一次编写,到处运行”的理想很有吸引力,但是现在编写的大多数应用程序都仅针对一个操作系统。造成这种情况的技术原因有两个:由于 Java 框架在范围和丰富度上受到局限,因此开发人员常常使用专有类来访问目标平台的可用功能。第二,由于各种 Java 执行程序之间无法消除的不兼容性继续给真正的跨平台工作带来困难,因此开发人员必须在想要支持的所有平台上测试代码。因此,有些开发人员半开玩笑地将 Java 称为“一次编写,到处调试”的平台。
.NET 的安全功能更丰富。除了加密 API、安全 cookie 和身份验证之外,.NET 还是一个能够根据代码来源给不同用户群分配不同权限等级的丰富的可扩展机制。例如,所有来自 Microsoft 的代码都被看作是安全的。可以允许或禁止所有来自特定 URL 的代码读/写临时目录或屏幕等特定资源。另外,应用程序可以被标志为需要某种权限(例如需要访问文件系统)。如果没有这些权限,那么该应用程序就不会被加载。由于安全检查是在加载时进行的,因此开发人员不必在整个应用程序中编写安全失败检查逻辑。这一点是通过一项称为“代码访问安全”的新技术管理的,这种技术对从 Internet 或本地机器加载的代码都有效。
.NET Framework 有一个比 Java 更强大的版本控制系统。在 Java 中,如果安装了同一个类的两个版本,那么 Java 运行时将简单地加载在类路径上找到的第一个类而不管它是哪个版本。而 .NET 则具有丰富的版本支持。通过并行执行,.NET 可以在同一时刻加载和执行同一个类的两个或更多不同版本。各应用程序都可以选择自己的绑定机制:无论是绑定在一个类库的特定版本上、库的最新版本上,还是绑定在特定位置的版本上。另外,可以按不同的机器应用规则,以便替代或进一步优化版本控制。这种版本控制方法也适用于编程语言。例如,在 C# 语言中,默认情况下方法不是虚函数,因此开发人员必须明确声明可被替代的方法。这意味着组件不能在基类中偶然中断行为。C# 不要求开发人员明确声明一种方法会引起哪些异常。如果异常列表发生变化,客户端代码仍能正常运行。
.NET 胜过 Java 之处还在于其深入调整应用程序行为和性能的能力。核心应用程序构建模块是为可伸缩性和高吞吐量设计的。例如,在 ADO.NET 数据访问断开的情况下,可以在内存内完成更多函数,而这些函数在 Java 数据库连接 (JDBC) 中要求来回访问数据库。另外,.NET 应用体系结构设计目标是更快的速度。例如,ASP.NET Web 页的性能比 Active Server Page (ASP)、Java Server Page (JSP) 和 HTML 内嵌脚本语言提高了很多。与 Java 平台相比,.NET 无论在单用户情况还是在多用户情况,性能都更好。
VeriTest(R) Benchmark and Performance Testing Microsoft(R) .NET Pet Shop http://www.gotdotnet.com/team/compare/veritest.aspx(英文)。 有两种方法可以将 Java 应用程序迁移到 .NET:将它们升级到 Visual J# .NET 或将它们转换到 Visual C# .NET。如下所述,这两种方法要求进行不同的工作,各有自己的优点。由于 NDP 的完整版本只能在 Microsoft Windows 上使用,因此两种方法都意味着将应用程序迁移到 Microsoft Windows。尽管 NDP 中包含面向 Visual C# .NET、Visual Basic .NET 及 Visual J# .NET 的命令行编译器,但我们在下文中假设开发人员使用 Visual Studio .NET 将应用程序迁移到 .NET。如前所述,Visual Studio .NET 是效率最高的 .NET 应用程序开发工具。
Visual J# .NET 是针对 .NET Framework 的 Java 语言实现,可以从 MSDN 的 Visual J# 站点(英文)获得。
J# 是 Microsoft 独立开发的,它将 Java 语言代码编译为 MSIL。Visual J# .NET 包括一个 Java 语言编译器、JDK 1.1.4 类库和一个将编译好的 Java 字节码升级为 MSIL 的工具(这个工具可用于将类库升级为可以从 .NET 应用程序使用的格式)。除了 JDK 1.1.4 类库,和其他兼容 .NET 的语言一样,Visual J# .NET 可以充分访问 .NET Framework,包含用于 Windows 窗体和 Web 窗体开发的设计器。
升级到 Visual J# .NET 是将 Java 应用程序迁移到 .NET Framework 的最简单、最快速的方法。Visual J# .NET 有开发人员熟悉的语法和类库,因此开发人员可以利用有关 Java 的原有知识,.NET Framework 很快就能上手。应用程序升级到 Visual J# .NET 后可以立即带来一些好处:升级速度很快,开发人员可以开始添加 .NET Framework 和 Microsoft 扩展给 Java 语言带来的新功能。使用 Visual Studio .NET 打开一个 Visual J++ 6.0 项目,即可激活 Visual J# .NET Upgrade Wizard(Visual J# .NET 升级向导)。
Java Language Conversion Assistant(Java 语言转换助手)可以从 Java Language Conversion Assistant 站点(英文)下载。Java Language Conversion Assistant(Java 语言转换助手)可将 Java 应用程序转换为 Visual C# .NET 应用程序。调用 Java API 的代码被转换为使用 .NET Framework 的相应 C# 代码。由于这种转换很复杂,因此不是所有 Java API 都能被转换。Java Language Conversion Assistant(Java 语言转换助手)能转换 90% 的 JDK 1.1.4 调用,而其余 10% 则会在代码中标出问题。每个问题都链接到一个主题,指导完成转换应作哪些修改。
转换到 C# 的应用程序可以获得最大的灵活性:尽管转换到 C# 比升级到 Visual J# .NET 慢,但是由于应用程序转换后使用本机 .NET Framework API,这带来了更多机会。修改完成后,转换后的代码可以立即象 Visual J# .NET 那样利用 .NET Framework 的高性能、可伸缩性、安全性及版本控制能力。
与 Visual J# .NET 不同,Java Language Conversion Assistant(Java 语言转换助手)支持 Visual J++ 6.0 松散文件和基于目录的项目的转换。从 Visual Studio .NET 菜单中选择 File(文件),再选择 Open(打开),然后选择 Convert(转换),即可激活 Java Language Conversion Assistant(Java 语言转换助手)。
决定使用哪个兼容 .NET 的语言迁移 Java 应用程序主要是一个个人选择问题。如前所述,Visual J# .NET 和 Visual C# .NET 都编译为相同的 MSIL,这两种语言都访问相同的 .NET Framework,提供相对一致的功能。
为了帮助您进行选择,下面是在选择是升级到 Visual J# .NET 还是转换到 Visual C# .NET 时应该考虑的三个主要决定因素:
迁移时间
当 Java 应用程序被升级到 Visual J# .NET 时,语言仍然是 Java,对 JDK 1.1.4 API 的调用保留原样。当同一应用程序被转换到 C# 时,语言转换为 C#,Java API 调用被转换为本机 .NET Framework 调用。这种转换的质量非常高(常常达到 90% 以上),但是在 Java Language Conversion Assistant(Java 语言转换助手)工作结束后仍然需要一些修改。如果缩短迁移时间非常重要,那么 Visual J# .NET 可能是最好的选择。
框架
被转换到 C# 的应用程序可以立即利用新 .NET Framework 比 Java 平台更高的性能、可伸缩性及版本控制能力。对于升级到 Visual J# .NET 的应用程序,尽管您可以用 .NET Framework 添加新功能,但是它仍然使用 Java 数据类型和 Java 库。如果非常需要让应用程序的体系结构利用 .NET Framework 的优势,那么 C# 可能是最好的选择。
语言
对于许多人而言,最重要的考虑因素仅仅是语言喜好:不管您是使用 Java 还是使用 C# 开发应用程序。这主要是一个个人选择问题。Visual J# .NET 和 C# 都源于 C++,有类似的语法和功能。对于已经在 Java 上做出投入并想继续使用 Java 的人而言,Visual J# .NET 可能是最好的选择。对于想转向为开发 .NET 应用程序专门设计的“本机”.NET 的语言的开发人员而言,C# 可能是最好的选择。
为了更深入地理解这两种选择,下一节讨论了应用程序被迁移到 .NET 后会发生什么情况。
两种迁移方法得到的结果不同。下面的两个表说明了 Java 项目的组成要素被迁移到 .NET 时的变化。
Java 技术 升级到 Visual J# .NET 转换到 C# Java 语言
Java 语言
C# 语言
小程序
不转换
Windows 窗体控制
JavaBean
JavaBean
C# 类(BeanInfo 和 ClassInfo 不转换)
ActiveX 控件
不转换
ActiveX 控件
AWT 框架
AWT 框架
Windows 窗体
WFC 窗体
WFC 窗体
Windows 窗体
编译后的库
编译后的库
不转换
资源文件
ResX 文件
ResX 文件
软件包 升级到 Visual J# .NET 转换到 C# com.ms.awt
java.awt
Java.awt
System.Windows.Forms
com.ms.com
com.ms.com
System.Runtime.InteropServices
com.ms.dll
com.ms.dll
System.Runtime.InteropServices
System.ComponentModel
com.ms.dxmedia
不升级
DirectAnimation
com.ms.fx
不升级
System.Windows.Forms
com.ms.io
com.ms.vjsharp.io
System.IO
com.ms.lang
com.ms.lang
System
Microsoft.Win32.RegistryKey
com.ms.object
com.ms.vjsharp.object
System
com.ms.ui
不升级
System.Windows.Forms
com.ms.util
com.ms.util
System
System.Collections
System.Diagnostics
com.ms.wfc.app
com.ms.wfc.app
System.Windows.Forms System.Globalization.CultureInfo Microsoft.Win32
System.Environment.SpecialFolder
System.Threading
System.DateTime
com.ms.wfc.core
com.ms.wfc.core
System
System.ComponentModel System.Windows.Forms.Design System.ComponentModel.Design System.Resources
com.ms.wfc.data
com.ms.wfc.data
ADODB
System.Runtime.InteropServices
RDS System.Globalization
System
System.ComponentModel
MSDASC
System.Resources
com.ms.wfc.data.adodb
com.ms.wfc.data.adodb
ADODB
com.ms.wfc.data.ui
com.ms.wfc.data.ui
System.Windows.Forms
System.Data
System
com.ms.wfc.io
com.ms.wfc.io
System.IO
System.Globalization
com.ms.wfc.ole32
com.ms.wfc.ole32
com.ms.wfc.ui
com.ms.wfc.ui
System.Windows.Forms
com.ms.wfc.util
com.ms.wfc.util
System
System.Diagnostics
System.Collections System.Runtime.InteropServices System.Resources
System.Globalization
com.ms.wfc.win32 com.ms.win32
com.ms.wfc.win32 com.ms.win32
转换为 PInvoke 调用
java.io
java.io
System.IO
java.lang
java.lang
System
System.Threading
java.lang.reflect
java.lang.reflect
System.Reflection
System
java.math
java.math
System.Decimal
java.net
java.net
System.Net
System
System.IO
java.security
java.security
不转换
java.sql
java.sql
System.Data.OleDb
System.DateTime
java.text
java.text
System
System.Globalization
System.Resources
java.text.resources
java.text.resources
System.Resources
java.util
java.util
System
System.Collections
System.Globalization
System.Resources
System.Configuration
用兼容 .NET 的不同语言编写的组件可以很容易地彼此互操作,这样就能够从 Java 进行混合式迁移。在混合式迁移中,您将应用程序的一个组件升级为 Visual J# .NET 而将另一个组件转换到 C#。实际例子包括:将中间层组件升级为 Visual J# .NET,并从转换到 C# 的客户端访问它。您可以使用 Visual J# .NET 二进制转换器将库转换为任何兼容 .NET 的语言都能使用的格式。
Visual J# .NET 和 Java Language Conversion Assistant(Java 语言转换助手)的目标都是 Java 语言、JDK 1.1.4 库以及 Visual J++ 6.0 附带的 Microsoft 库。有些应用程序还使用 J2EE、J2SE 等新 Java 版本的技术。这些应用程序在迁移到 .NET 时常常需要进行一些额外修改。这些修改通常非常简单:迁移后,应用程序的大部分(业务逻辑和 JDK 1.1.4 类)都会得到完美的迁移。在迁移后的代码中,不支持的技术将保留不变。您必须使用类似的 .NET 技术替换未迁移的 Java 技术以完成迁移。由于 .NET 提供了一套比 Java 更丰富的类,因此在进行技术替换时您常常可以进行一些重大改进。
Swing 窗体软件包的迁移是一个很好的例子。
Java 包含两个竞争的窗体软件包:Abstract Windowing Toolkit (AWT) 和 Swing。JDK 1.1.4 提供 AWT。Visual J# .NET 支持 AWT,可以通过 Java Language Conversion Assistant(Java 语言转换助手)将 AWT 转换为 Windows 窗体。JDK 1.1.4 可以使用一个附加的 Swing 库,这个库是 J2SE 和 J2EE 类库的一部分。Swing 窗体布局不能自动迁移到 .NET。在迁移过程中,代码中的 Javax.Swing 类保留不变,您必须用 Windows 窗体类来替换它。为此,请在被迁移的应用程序中对各 Swing 窗体执行以下步骤: 向被迁移应用程序中添加一个新的 Windows 窗体向窗体中添加控件以获得与原有 Swing 窗体相同的布局将事件逻辑代码从被迁移的 Swing 窗体复制到新的 Windows 窗体中的事件处理程序从应用程序中删除被迁移的 Swing 窗体
图 2:在 Visual Studio 中重画 Swing 窗体 Windows 窗体提供了比 AWT 或 Swing 更丰富的环境,并且几乎在所有方面都包含 Java 平台中所能找到的功能的超集。例如,Windows 窗体使得控制窗体布局更加容易。Java 中的布局管理器常常会带来困难。获得所需的窗体布局需要了解布局管理器,并且即使是最基本的布局都需要编写许多代码。Windows 窗体通过为所有控件提供绝对定位而简化了窗体管理。另外,Windows 窗体可以通过靠接和锚定轻易地调整窗体大小。靠接规定一个控件应该始终占据屏幕的特定区域。锚定将窗体控件的一个或多个角“钉住”。调整窗体大小时使用这些“钉”确定控件的位置。使用靠接和锚定通常可以彻底消除复杂的窗体大小调整代码。
将 Swing 窗体迁移到 .NET 不仅非常简单,而且还可以利用 .NET Framework 更丰富的类改善应用程序。
Java Server Page (JSP) 和 Servlet 都是创建支持 Java 的 Web 页的技术。JSP 提供了与 ASP 相似的脚本嵌入式 HTML 体系结构。Servlet 为没有 HTML 代码的编译后 JSP 页提供了一个机制。两项技术都使用 Java 代码,都为 Web 页提供基于事件的编程。
JSP 和 Servlet 可以迁移到 ASP.NET,这么做有很多好处:ASP.NET 是一种更加强大的技术,它比 JSP、PHP(PHP 超文本预处理器)、ASP 及其他解释型脚本嵌入式 HTML 体系结构具有更高的可伸缩性和性能。但是,在撰写本文时还没有将 JSP 迁移到 ASP.NET 的自动系统。Microsoft 已经宣布在 2002 年下半年推出将 JSP 转换为 C# ASP.NET 的 Java Language Conversion Assistant(Java 语言转换助手)扩展。同时也在考虑今后推出 JSP 到 Visual J# .NET ASP.NET 的转换。
本节演练从 Visual J++ 6.0 到 Visual J# .NET 的升级和从 Java 到 C# 的转换。两个演练的目的都是介绍迁移技术。显然,两种迁移都远远不止这里介绍的内容。另外,可以使用任意一种迁移技术很好地迁移这两个应用程序示例。
++ 6.0 项目升级到 Visual J# .NET 本节将一步步演练 Visual J++ 6.0 应用程序升级到 Visual J# .NET 和 .NET 的过程。
要升级的应用程序是 MDIWordPad 项目。这是 Visual J++ 6.0 附带的 MSDN 示例,可以作为 Visual J++ 6.0 产品示例的一部分下载。此应用程序的功能与 WordPad 相似。它提供打开和编辑多个文本文件的功能。它还提供简单的格式化功能。这些功能是通过菜单或工具栏提供的。图 3 是 MDIWordpad 应用程序的 Visual J++ 版本。
为了得到最佳结果,应该使用 Visual J# .NET Upgrade Wizard(Visual J# .NET 升级向导)将 Visual J++ 6.0 项目升级到 Visual J# .NET。请按以下步骤进行升级: 在 Visual Studio .NET 中,从菜单中选择 File(文件),再选择 Open(打开),然后选择 Project(项目)。找到 MDIWordPad.vjp 项目文件的位置并单击 Open(打开)。Visual Studio .NET 检测到您要打开的文件是 Visual J++ 6.0 项目并打开 Visual J# .NET Upgrade Wizard(Visual J# .NET 升级向导)。
阅读完介绍文字后,单击下一步进入向导的第二页。此页面要求提供您正在升级的项目的类型信息。MDIWordPad 示例是一个 Windows 应用程序,因此默认值是正确的。如果您要升级的项目是一个控制台应用程序或类库,您就应该选择一个选项。确认选定了 Windows 应用程序后,单击下一步进入升级向导的下一页。
对于使用 Active X 控件或其他 COM 引用的应用程序,您可以在这一页上明确添加对这些组件的引用。添加这些引用可以帮助升级向导找到项目中使用的附加类型。虽然即使您不在这里指定它们,升级向导也可以找到并将这些引用添加到项目中,但是现在添加它们可以加快升级速度。MDIWordPad 没有使用任何外部组件,因此请单击 Next(下一步)而不需要做任何改动。现在,升级向导开始评估项目并将项目文件和引用升级到 Visual J# .NET。会显示一个状态条和变化的文本,提示向导目前的进度。处理结束之后,升级向导将自动进入最后一页。在向导的最后一页中,您可以使用一个复选框选择是否查看项目升级报告。单击 Finish(完成)显示升级报告。
升级报告列出了有关应用程序及升级进程的信息。如果在项目转换中发现了问题或丢失的引用,它们将在这里列出。该报告中还包括有关升级向导向新解决方案中添加的文件的信息。在 Solution Explorer(解决方案资源管理器)中双击文件 MDIWordPad.java 以便在 Code Editor(代码编辑器)中将其打开。通过浏览该文件,您会发现源代码看起来与原先完全相同。事实上,将一个项目升级到 Visual J# .NET 并不要求任何形式的源代码修改,所要求修改的只是解决方案、项目和资源文件。源代码文件本身的内容保持不变。
按 F5 运行升级后的应用程序。应用程序的表现没有变化,您可以通过编辑一些文本来验证这一点。应用程序的操作与升级前完全相同,只是它现在是运行在 .NET 上。
将应用程序升级到 Visual J# .NET 是一个非常简单的过程。升级向导会帮助您提供顺利升级所需的信息,并且升级后项目的源代码没有任何变化。通过 Visual J# .NET 提供的工具升级到 .NET 是一个极其快速和简单的过程。由于二者有相似的语言和类库,因此升级到 Visual J# .NET 是将 J++ 项目迁移到 .NET 的最快方法。
本节将一步步演练将一个 Visual J++ 6.0 应用程序转换到 C# 和 .NET 的过程。要转换的应用程序是一个称为 Island Book Sales 的简单的最终用户购买程序。该应用程序演示转换的各个方面(AWT 到 Windows 窗体、JDBC 到 ADO.NET、Java 到 C#)。它还演示转换后需要解决的一些问题。Island Book Sales 有两个窗体。第一个窗体向用户展示可供出售的书的列表。所提供的书包含在一个 Access 数据库中,可使用 JDBC 读取该数据库。用户可以选择要购买的物品并将它放入购物车中。用户的购物车显示在第二个窗体中。该窗体使用户能够取消或购买购物车中的物品。图 6 是运行中的应用程序。
以下是将应用程序转换到 C# 和 .NET 所需的步骤: 在 Visual Studio 中的 File(文件)菜单上单击 Open(打开),然后单击 Convert(转换)。这将启动 Conversion(转换)对话框。
选定 Java Language Conversion Assistant(Java 语言转换助手)图标后单击 OK(确定),启动 Java Language Conversion Assistant(Java 语言转换助手)。虽然原应用程序是使用 Visual J++ 编写的,但本例中将它视作一个基于目录的转换。在向导的第二页中选择进行基于目录的转换选项,然后单击 Next(下一步)。在 Java Language Conversion Assistant(Java 语言转换助手)的第三页中,选择包含应用程序源代码的目录,然后单击 Next(下一步)。向导的第四页要求您输入一些有关应用程序的信息。键入“Bookstore”作为项目名。其他两个选项使用默认值,然后单击 Next(下一步)。
现在,Java Language Conversion Assistant(Java 语言转换助手)询问将转换后的项目文件写到哪里。选择要使用的目录后单击 Next(下一步),必要时让 Java Language Conversion Assistant(Java 语言转换助手)创建目录。再次单击 Next(下一步)开始转换。转换完成后向导结束。单击 Close(关闭)按钮关闭向导。按 SHIFT+F7 打开窗体设计器。请注意,在设计器中可以看到窗体及其组件。Java Language Conversion Assistant(Java 语言转换助手)将 AWT 组件转换成了 Windows 窗体组件。可以使用 Windows 窗体设计器查看转换后的窗体。
从 View(视图)菜单中选择 Task List(任务列表)。您将看到转换后的文件中添加了几条升级说明。必须先解决这些问题应用程序才能正常运行。(如果现在生成和运行该应用程序,您将会发现该应用程序能够出现但是没有可用数据。)双击 Task List(任务列表)中的第一条注释,这将通过 retrieveData() 方法将光标移到第一条错误。此方法负责查询数据库并将有关可用标题的信息返回给应用程序。浏览此方法的代码会发现 JDBC 调用被转换成了 ADO.NET 调用。必须做些必要的修改后此代码才能正确运行。在 retrieveData 中,第一条注释 Upgrade_ToDo 说方法 Class.forName 参数的格式已改变。这条注释下面的代码行用于加载原代码中的 JDBC 驱动程序,但是对于 ADO.NET 不必这样做。请删除这条转换说明及其下面的代码行。下一条转换注释告诉您 ADO.NET 中的连接字符串格式改变。如果您已经知道新的连接字符串格式,就将它输入到变量 URL 的声明中。 您还可以使用 Visual Studio .NET 中的工具编写字符串,而不必记住连接字符串的格式。按 SHIFT+F7 在设计器中打开窗体。从 ToolBox(工具箱)的 Data(数据)选项卡中,将一个 OleDbConnection 对象拖到窗体上。在 Properties(属性)窗口中,单击 ConnectionString 属性的下拉列表并选择 New Connection(新连接)。这将显示 Data Link Properties(数据链接属性)对话框,帮助您指定一个数据库连接。保存所提供书籍的信息的数据库是一个 Access 数据库。当从一个 ADO.NET 的 Access 数据库中读取数据时,您可以使用 Microsoft Jet 4.0 OLE DB 提供程序。在 Data Link Properties(数据链接属性)对话框中单击 Provider(提供程序)选项卡选择该数据提供程序,然后单击 Next(下一步)。找到该示例数据库的 .mdb 文件,然后单击 OK(确定)。DataAdapter 的 ConnectionString 属性现在包含格式正确的示例数据库连接字符串。将此字符串复制并粘贴到 retrieveData 方法的 URL 变量的声明中。在字符串前添加一个 @ 符号,以告诉 C# 应该按字面解释该字符串。修改后,声明或 URL 应该如下所示:
现在,这个升级问题已经解决,您可以删除这条转换注释。后面的两条升级注释不影响本应用程序,可以忽略或删除它们。按 F5 运行该应用程序。该应用程序将被加载,您可以看到它的工作状态与原应用程序相同。 我们以最容易的方式将这个两层的应用程序从 Java 转换成了 C#。虽然该应用程序很小,但是上面介绍的方法适用于所有转换项目。
Java 到 Visual J# .NET 和 Java 到 C# 的迁移工具可以简便有效地将 Java 应用程序迁移到 .NET。另外,您迁移后的应用程序可以立即利用 .NET 的所有优点,这使开发人员能够向原有应用程序中添加新的功能,使最终用户能够享受到 .NET 应用程序比 Java 应用程序高得多的性能。
在迁移到 .NET 的过程中,开发人员可以将应用程序升级到 Visual J# .NET 或将其转换到 C#。这两种方法各有其优点:升级到 Visual J# .NET 速度最快、最简单,Java 应用程序可以迅速地获得 .NET 提供的功能;转换到 C# 速度较慢,但是转换后的应用程序可以获得最大程度的灵活性。是使用 Visual J# .NET 还是使用 Visual C# .NET,这主要是一个个人选择问题。
选择任何一种迁移技术都能为您的旧应用程序注入新的活力。Visual Studio .NET 和 .NET Framework 标志着软件开发的新纪元。