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

IKVM.NET 详解

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.84/5 (6投票s)

2013年5月21日

CPOL

6分钟阅读

viewsIcon

61244

本文将详细介绍 IKVM.NET。这是一篇关于 IKVM.NET 的简短教程,您可以在本文中找到如何在 .NET 中使用 Java 类或库。

介绍 

IKVM.NET 是 Microsoft .NET Framework 和 Mono 的一个开源的 JVM 实现。假设您已经用 Java 开发了一个库,并想在您的 .NET 项目中使用它,那么 IKVM.NET 就可以派上用场,帮助您在 .NET 中使用 Java 库。如今,Java 和 .NET 是软件开发的两大主流技术,而 Java 是一个更成熟的技术,已经有很多工作在此基础上完成。因此,在可重用性方面,使用在 Java 中创建并需要在 .NET 中使用的库是一种非常常见的做法。

详情   

IKVM.NET 包含以下三个主要组件:

1. 一个用 .NET 实现的 Java 虚拟机:  

 它有一个用 C#.NET 开发的 JVM,提供了字节码翻译和  验证、类加载等功能。

2. Java 类库的 .NET 实现

它主要使用OpenJDK 项目来实现 JDK 库。

3. 启用 Java 和 .NET 互操作性的工具 

IKVM.NET 包含以下工具:  

a) ikvm - Java 虚拟机

b) ikvmc - 将 Java 字节码编译为 CIL

c) ikvmstub - 从 .NET 程序集生成 Java 存根类

 

a) IKVM.NET 虚拟机 (ikvm.exe)

这是启动器可执行文件。我们可以将其与 java.exe(“动态模式”)进行比较。它加载类文件并执行其 main 方法;如果我们将类文件名作为参数传递,它将执行可执行 jar 文件中的 Java 代码;如果我们执行时传递 jar 文件作为参数。

用法语法:      

 ikvm [ options ] classname [ args1,args2…..argsN]
  
 ikvm [ options ] -jar jarfile [args1,args2…..argsN]
        

示例

 ikvm -jar /usr/share/myprog.jar 

执行可执行 jar 文件 /usr/share/myprog.jar 中的 Java 代码。

b) IKVM.NET 字节码编译器 (ikvmc.exe)

这是一个静态编译器,用于将 Java 类和 jar 编译为 .NET 程序集(“静态模式”)。此工具将 Java 字节码转换为 .NET dll 和 exe。它将输入文件中的 Java 字节码转换为 .NET DLL。因此,当我们传递多个 jar 文件和类文件时,它们将合并并生成单个 .exe 或 dll 文件。.exe 或 .dll 取决于我们传递的类文件和 jar 文件是否包含 Main 方法。如果它们包含 main 方法,则会生成 exe,否则生成 DLL。

用法语法

ikvmc [ options ] classOrJarfile [ classOrJarfile ... ]

示例:  

ikvmc myProg.jar  

扫描 myprog.jar 以查找 main 方法。如果找到,将生成 .exe;否则,将生成 .dll。

c) IKVM.NET 存根生成器 (ikvmstub.exe)

 一个工具,用于从 .NET 程序集生成存根类文件,以便 Java 代码可以针对 .NET 代码进行编译。ikvmstub 工具从 .NET 程序集生成 Java 存根。ikvmstub 读取指定的程序集并生成一个包含 Java 接口和存根类的 Java jar 文件。有关生成的存根的更多信息。该工具使用以下算法来定位程序集:

首先,它尝试从 ikvmstub.exe 的默认加载上下文中加载程序集。实际上,这通常意味着它会搜索全局程序集缓存 (Global Assembly Cache)。 

如果在默认加载上下文中找不到,ikvmstub 会在指定的路径(如果未提供路径,则为当前目录)查找程序集。

用法语法:         

ikvmstub assemblyNameOrPath
       

示例:          

ikvmstub c:\lib\mylib.dll 
      

生成 mylib.jar,其中包含 c:\lib\mylib.dll 中定义的类、接口等存根。

我们可以通过两种方式使用 IKVM.NET:

1) 动态模式

 在此模式下,Java 类和 jar 被直接用于在 .NET 运行时上执行 Java 应用程序。   在此模式下支持完整的 Java 类加载器模型。

2) 静态模式

为了让 .NET 应用程序能够使用 Java 代码,必须将其编译为 DLL 并  直接使用。程序集可以被 .NET 应用程序直接引用,并且“Java”对象    可以被当作 .NET 对象使用。虽然静态模式不支持完整的 Java 类  加载器机制,但静态编译的代码可以创建类加载器并动态加载类。

IKVM.NET 的用途 

IKVM.NET 在多种不同的软件开发场景中都很有用。以下是一些可能性的示例。 

1) 兼容的 JVM: 

随发行版提供的 IKVM 应用程序是 Java 虚拟机的一个 .NET 实现。在许多情况下,您可以将其用作 java 的即插即用替代品。例如,您不需要键入    java -jar myapp.jar 来运行应用程序,而是可以键入 

 ikvm -jar myapp.jar

2) 在您的 .NET 应用程序中使用 Java 库

IKVM.NET 包含 ikvmc,一个 Java 字节码到 .NET IL 的翻译器。如果您有一个想在 .NET 应用程序中使用的 Java 库,请运行 ikvmc -target:library mylib.jar 来创建 mylib.dll。

例如,Apache FOP 项目是一个用 Java 编写的开源 XSL-FO 处理器,广泛用于从 XML 源生成 PDF 文档。通过 IKVM.NET 技术,任何 .NET 应用程序都可以使用 Apache FOP。

3) 用 Java 开发 .NET 应用程序 

IKVM 提供了一种用 Java 开发 .NET 应用程序的方法。尽管 IKVM.NET 不包含用于 .NET 的 Java 编译器,但您可以使用任何 Java 编译器将 Java 源代码编译为 JVM 字节码,然后使用 ikvmc -target:exe myapp.jar 来生成 .NET 可执行文件。您甚至可以使用随附的 ikvmstub 应用程序在 Java 代码中使用 .NET API。

示例:  

现在让我们看看如何将 Java 中创建的类文件或库用于 .NET。我在这里用 Java 创建了一个用于显示欢迎语和告别语的类文件和库。Java 文件中的代码如下:

package Msg;
public class Message {
    
    
  public static void WelcomeMsg(String msg) {
   
       System.out.println("Welcome"+msg);
              
   }
   
  public static void GoodByeMsg(String msg) {
   
       System.out.println("Good Bye"+msg);
              
   }
    
}
   

现在将此 Java 文件编译为类文件,因此我们有了 Message.class 文件。我还创建了 Message.jar 文件,因为我将演示如何使用类文件或 jar 文件生成 DLL 文件,这需要使用 IKVM.NET。通过以下方式,我们可以从类文件生成 jar 文件:

jar cvf Message.jar Message.class 

 现在我们需要从类文件或 jar 文件生成 Message DLL。因此,我们需要为此使用 IKVMC。您可以从这里下载 IKVM.NET。 

下载此 zip 文件并解压后,您可以看到 bin 文件夹。在 bin 文件夹中,您可以找到所有必要的文件。现在将您的类文件或 jar(Message.classMessage.jar 文件)复制到 bin 文件夹中。打开命令提示符,然后使用 cd 命令导航到此 bin 文件夹。

键入以下命令以从类文件或 jar 文件生成 DLL 文件。

ikvmc -target:library    Message.jar 
ikvmc -target:library    Message.class 

 

您可以使用上述任一命令来生成 dll 文件。现在,您将在 bin 文件夹中找到 Message.dll 文件。  

在 c#.net 中创建一个控制台项目。添加 Message.dllIKVM.OpenJDK.Core.dll 的引用。在您的项目中编写以下代码以访问此 dll 的方法:

using Msg;

namespace MessageDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            Message.WelcomeMsg(" Abhishek");

            Console.WriteLine("Now you can start your work............");

            Message.GoodByeMsg(" Abhishek");

        }
    }
}

现在您可以运行您的项目了。 您将看到以下输出:

 

 

兴趣点 

IKVM.NET 对于同时了解 C# 和 Java 语言的开发人员来说是一个非常有趣的库,他们可以理解它有多么有用。如果他们在一种语言上工作并创建了一些重要的库,之后想在另一种语言中使用,那么他们可以使用 IKVM.NET 非常轻松地做到这一点。

参考资料  

http://www.ikvm.net/ 

© . All rights reserved.