IKVM.NET 详解






4.84/5 (6投票s)
本文将详细介绍 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.class
或 Message.jar
文件)复制到 bin 文件夹中。打开命令提示符,然后使用 cd 命令导航到此 bin 文件夹。
键入以下命令以从类文件或 jar 文件生成 DLL 文件。
ikvmc -target:library Message.jar ikvmc -target:library Message.class
您可以使用上述任一命令来生成 dll 文件。现在,您将在 bin 文件夹中找到 Message.dll
文件。
在 c#.net 中创建一个控制台项目。添加 Message.dll
和 IKVM.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 非常轻松地做到这一点。
参考资料