在您的 .NET 应用程序中使用 Java 类
IKVM.NET 是 Mono / Microsoft .NET Framework 的一个开源 Java 实现,它使得既能用 Java 开发 .NET 应用程序,也能在用任何 .NET 语言编写的应用程序中使用现有的 Java API 和库。
引言
假设您被要求将一个现有的多层应用程序迁移到 .NET,其中业务层是用 Java 编写的。通常情况下,您别无选择,只能将整个应用程序重写并移植到任何 .NET 语言(例如 C#)。然而,这正是 IKVM.NET 可以为您提供帮助的地方。
IKVM.NET 是 Mono / Microsoft .NET Framework 的一个开源 Java 实现,它使得既能用 Java 开发 .NET 应用程序,也能在用任何 .NET 语言编写的应用程序中使用现有的 Java API 和库。它用 C# 编写,您可以从 这里 下载可执行文件、文档和源代码。
IKVM.NET 由以下三个主要部分组成:
- 一个用 .NET 实现的 Java 虚拟机
- 一个 .NET 实现的 Java 类库
- 支持 Java 和 .NET 互操作性的工具
然而,在我们深入探讨这个主题之前,先来讨论一下 IKVM.NET 包中的一些主要组件,我们将在本文稍后使用它们。
- IKVM.Runtime.dll:VM 运行时和所有支持代码,包含字节码 JIT 编译器/验证器、对象模型重映射基础设施以及 Classpath 中本地方法的托管 .NET 重实现。
- IKVM.GNU.Classpath.dll:GNU Classpath 的编译版本,这是自由软件基金会的 Java 类库实现,外加一些 IKVM.NET 特定的代码。
- ikvm.exe:启动可执行文件,类似于 java.exe(“动态模式”)。
- ikvmc.exe:静态编译器。用于将 Java 类和 jar 文件编译成 .NET 程序集(“静态模式”)。
现在回到我们迁移现有 Java 业务类以便新提出的 .NET 应用程序可以访问它们的问题。我们也希望在我们的 .NET 应用程序中使用各种现有的 Java API 和库。让我们先从那里开始。
设置 IKVM.NET
从 sourceforge 站点下载二进制发行版,并将内容解压到 C:\ikvm(或 X:\ikvm,其中 X 是您的驱动器)。您会在 C:\ikvm\bin 目录中找到 ikvm 可执行文件和 DLL。打开命令或 shell 窗口,cd 到 C:\ikvm\bin,然后输入 ‘ikvm’。
如果您的系统运行正常,您应该会看到以下输出:
usage: ikvm [-options] <class> [args...] (用于执行一个类) 或 ikvm -jar [-options] <jarfile> [args...] (用于执行一个 jar 文件)
对于基于 Linux 的系统,设置与上述类似。这就是运行演示应用程序所需的所有操作。
我们的演示 Java 业务类 (JavaToNet.java)
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 类文件来生成将在我们的 C# 程序中引用的 .NET DLL。
使用 IKVM.NET 将 Java 类转换为 .NET DLL
将上面的 Java 类文件(JavaToNet.class)复制到 C:\ikvm\bin 目录。现在运行以下命令:

这将从 JavaToNet.class 文件创建 JavaToNet.dll。ikvmc.exe 还有其他命令行选项。例如,‘ikvmc –target:exe javaToNet.class
’ 将创建一个 EXE 而不是 DLL。您可以通过在命令行中输入 ‘ikvmc’ 来获取所有选项。
设置您的 .NET 开发环境
-
首先创建一个 C# Windows 应用程序项目。
-
将控件拖放到窗体上,如图所示
-
将以下 DLL 添加为项目的引用。这两个 DLL 都位于 C:\ikvm\bin 文件夹中。
- JavaToNet.dll
- IKVM.GNU.Classpath.dll
-
将以下代码添加到“计算”按钮的点击事件中:
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;
-
将以下代码添加到“时区”按钮的点击事件中。
private void btnTimeZone_Click(object sender, System.EventArgs e) { MessageBox.Show(TimeZone.getDefault().getDisplayName()); }
-
编译并运行应用程序。C# 应用程序现在将调用 JavaToNet.dll 中的
AddNumbers()
、SubNumbers()
、MulNumbers()
和DivNumbers()
函数并返回结果。 -
点击“时区”按钮。该应用程序访问
java.util.TimeZone
类并显示该地点的确切时区。
结论
由于这些方法最初是用 Java 编写的,IKVM.NET 为我们提供了一种简单可行的方式,可以从 .NET 应用程序中访问这些类和方法。同样,如上面“时区”示例所示,您可以访问大多数现有的 Java 包(例如 java.io、java.util 等)并在您的应用程序中使用它们。
然而,存在一些缺点。IKVM.NET 仍在积极开发中,但对 AWT 类支持有限,因此目前可以排除移植 Java GUI。此外,一些默认的 Java 类仍在移植中,因此您可能无法获得所有所需的功能。另外,如果您的应用程序依赖于精确的 Java 类加载语义,您可能需要修改它以满足您的需求。
历史
- 03-25-06 首次发布