在企业级应用开发中,经常会遇到需要将Java编写的业务层代码迁移到.NET平台的情况。通常情况下,可能需要将整个应用重新编码并移植到.NET语言(例如C#)。然而,IKVM.NET的出现为提供了一种解决方案,使得可以在.NET平台上使用Java编写的代码。
IKVM.NET是一个开源的Java实现,它允许在.NET平台上开发Java应用程序,并且可以使用现有的Java API和库。IKVM.NET是用C#编写的,其可执行文件、文档和源代码可以从官方网站下载。
IKVM.NET由以下三个主要部分组成:
在深入讨论之前,让先了解一下IKVM.NET包中将在本文中使用的一些主要组件:
目标是将现有的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文件夹中。
将以下代码添加到‘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等),并在应用程序中使用它们。