65.9K
CodeProject 正在变化。 阅读更多。
Home

在您的 .NET 应用程序中使用 Java 类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (23投票s)

2006年3月24日

CPOL

4分钟阅读

viewsIcon

284066

downloadIcon

6477

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 由以下三个主要部分组成:

  1. 一个用 .NET 实现的 Java 虚拟机
  2. 一个 .NET 实现的 Java 类库
  3. 支持 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.dllikvmc.exe 还有其他命令行选项。例如,‘ikvmc –target:exe javaToNet.class’ 将创建一个 EXE 而不是 DLL。您可以通过在命令行中输入 ‘ikvmc’ 来获取所有选项。

设置您的 .NET 开发环境

  1. 首先创建一个 C# Windows 应用程序项目。

  2. 将控件拖放到窗体上,如图所示

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

    • JavaToNet.dll
    • IKVM.GNU.Classpath.dll
  4. 将以下代码添加到“计算”按钮的点击事件中:

    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)));            
        }
    }
  5. *.cs 文件的顶部添加以下 using 指令:

    using TimeZone = java.util.TimeZone;
  6. 将以下代码添加到“时区”按钮的点击事件中。

    private void btnTimeZone_Click(object sender, System.EventArgs e)
    {
    MessageBox.Show(TimeZone.getDefault().getDisplayName());
    }
  7. 编译并运行应用程序。C# 应用程序现在将调用 JavaToNet.dll 中的 AddNumbers()SubNumbers()MulNumbers() DivNumbers() 函数并返回结果。

  8. 点击“时区”按钮。该应用程序访问 java.util.TimeZone 类并显示该地点的确切时区。

结论

由于这些方法最初是用 Java 编写的,IKVM.NET 为我们提供了一种简单可行的方式,可以从 .NET 应用程序中访问这些类和方法。同样,如上面“时区”示例所示,您可以访问大多数现有的 Java 包(例如 java.iojava.util 等)并在您的应用程序中使用它们。

然而,存在一些缺点。IKVM.NET 仍在积极开发中,但对 AWT 类支持有限,因此目前可以排除移植 Java GUI。此外,一些默认的 Java 类仍在移植中,因此您可能无法获得所有所需的功能。另外,如果您的应用程序依赖于精确的 Java 类加载语义,您可能需要修改它以满足您的需求。

历史

  • 03-25-06 首次发布
© . All rights reserved.