使用IKVM.NET将Java业务层迁移到.NET平台

在企业级应用开发中,经常会遇到需要将Java编写的业务层代码迁移到.NET平台的情况。通常情况下,可能需要将整个应用重新编码并移植到.NET语言(例如C#)。然而,IKVM.NET的出现为提供了一种解决方案,使得可以在.NET平台上使用Java编写的代码。

IKVM.NET是一个开源的Java实现,它允许在.NET平台上开发Java应用程序,并且可以使用现有的Java API和库。IKVM.NET是用C#编写的,其可执行文件、文档和源代码可以从官方网站下载。

IKVM.NET的主要组成部分

IKVM.NET由以下三个主要部分组成:

  • 一个用.NET实现的Java虚拟机
  • .NET实现的Java类库
  • 能够实现Java和.NET互操作的工具

IKVM.NET包的主要组件

在深入讨论之前,让先了解一下IKVM.NET包中将在本文中使用的一些主要组件:

  • IKVM.Runtime.dll:包含虚拟机运行时和所有支持代码,包括字节码JIT编译器/验证器、对象模型重映射基础设施以及类路径中本地方法的托管.NET重新实现。
  • IKVM.GNU.Classpath.dll:GNU Classpath的编译版本,它是自由软件基金会实现的Java类库,加上一些IKVM.NET特定的代码。
  • ikvm.exe:启动可执行文件,类似于java.exe(“动态模式”)。
  • ikvmc.exe:静态编译器。用于将Java类和jar文件编译成.NET程序集(“静态模式”)。

迁移现有的Java业务类

目标是将现有的Java业务类迁移,以便它们可以被新的.NET应用程序访问。也希望在.NET应用程序中使用各种现有的Java API和库。让从这里开始。

从SourceForge网站下载二进制分发版,并将内容解压到C:\ikvm(或X:\ikvm,其中X是驱动器)。会发现ikvm可执行文件和DLLs在C:\ikvm\bin目录中。打开命令或shell窗口,cd到C:\ikvm\bin,然后输入‘ikvm’。

如果系统运行正常,应该看到以下输出:

usage: ikvm [-options] <class> [args...] (to execute a class) or ikvm -jar [-options] <jarfile> [args...] (to execute a jar file)

对于基于Linux的系统,设置与上述类似。这就是运行演示应用程序所需的全部操作。

public class JavaToNet { public static void main(String[] args) { System.out.println("This is a demonstration Program which\n"); System.out.println("shows the conversion of Java class to\n"); System.out.println("a .NET dll\n"); } public static double AddNumbers(double a, double b) { double c = 0; c = a + b; return c; } public static double SubNumbers(double a, double b) { double c = 0; c = a - b; return c; } public static double MulNumbers(double a, double b) { double c = 0; c = a * b; return c; } public static double DivNumbers(double a, double b) { double c = 0; c = a / b; return c; } }

Java类非常简单。它有四个函数,分别用于加、减、乘和除,接受两个double值并返回结果。目标是通过C#应用程序访问这些函数。编译上述Java文件以获得JavaToNet.class。将使用这个Java类文件生成.NET DLL,以便在C#程序中引用。

将上述Java类文件(JavaToNet.class)复制到C:\ikvm\bin目录。现在运行以下命令:

ikvmc -target:library JavaToNet.class

这将从JavaToNet.class文件创建JavaToNet.dll。ikvmc.exe还有其他命令行选项。例如:‘ikvmc –target:exe JavaToNet.class’将创建一个EXE而不是DLL。可以通过在命令行中输入‘ikvmc’来获取所有选项。

首先创建一个C# Windows应用程序项目。将控件拖放到表单中,如下所示:

将以下DLL作为引用添加到项目中。这两个DLL都位于C:\ikvm\bin文件夹中。

  • JavaToNet.dll
  • IKVM.GNU.Classpath.dll

将以下代码添加到‘Calculate’按钮的单击事件中:

private void btnCal_Click(object sender, System.EventArgs e) { if (rdAdd.Checked == true) { txtResult.Text = Convert.ToString(JavaToNet.AddNumbers(Convert.ToDouble(txtNum1.Text), Convert.ToDouble(txtNum2.Text))); } else if (rdSub.Checked == true) { txtResult.Text = Convert.ToString(JavaToNet.SubNumbers(Convert.ToDouble(txtNum1.Text), Convert.ToDouble(txtNum2.Text))); } else if (rdMul.Checked == true) { txtResult.Text = Convert.ToString(JavaToNet.MulNumbers(Convert.ToDouble(txtNum1.Text), Convert.ToDouble(txtNum2.Text))); } else { txtResult.Text = Convert.ToString(JavaToNet.DivNumbers(Convert.ToDouble(txtNum1.Text), Convert.ToDouble(txtNum2.Text))); } }

在*.cs文件的顶部添加以下using指令:

using TimeZone = java.util.TimeZone;

将以下代码添加到‘Time Zone’按钮的单击事件中:

private void btnTimeZone_Click(object sender, System.EventArgs e) { MessageBox.Show(TimeZone.getDefault().getDisplayName()); }

编译并运行应用程序。现在,C#应用程序将调用JavaToNet.dll中的AddNumbers()、SubNumbers()、MulNumbers()和DivNumbers()函数,并返回结果。

点击‘Time Zone’按钮。应用程序将访问java.util.TimeZone类,并显示确切的时区。

由于这些方法最初是用Java编写的,IKVM.NET为提供了一种简单且可行的方法,从.NET应用程序中访问这些类和方法。如上所示的‘Time Zone’示例,可以访问大多数现有的Java包(例如java.io、java.util等),并在应用程序中使用它们。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485