在.NET平台上使用和执行Java代码

2023/7/6 10:13:32

java-csharp-version

当大多数人都认为Java和.NET作为互斥技术的时候,IKVM.NET框架却改变了这个观点,IKVM.NET是基于.NET实现的Java虚拟机 (JVM) 和MONO运行时,IKVM.NET框架能够让您在.NET平台中复用Java代码,同时也提供在Java中复用.NET代码的解决方案,IKVM.NET实现跨平台复用有两种主要的方法。

当IKVM.NET运行于动态模式时,一个基于.NET的Java运行时被构建,这个运行时可直接将Java类和Jar编程成字节码,并执行它,在此模式下,并不需要将字节码翻译成CIL代码。当IKVM.NET运行于静态模式时,您可以在.NET应用程序中使用Java代码,可将Java中的包和类翻译成基于微软中间语言的CLI代码,最终生成dll程序集,您可以在.NET项目中直接引用这个程序集,即可通过调用C#一样的方式复用Java中的方法。静态模式下不支持完整的 Java运行时,静态模式主要使用静态编译技术,以创建一个类装入器和动态加载类。

IKVM.NET提供字节码翻译、验证、虚拟运行时VM、它是依赖JDK库实现的OpenJDK项目,IKVM.NET是由以下组件组成:

IKVM.Runtime.dll是在.NET平台中虚拟Java运行时的主要实现代码,提供Java字节码的验证和执行,并将字节码转换成支持.NET平台的CLI代码,它还将Java的对象模型映射成.NET对象模型,例如:可将Java的 java.lang.Object、java.lang.String和java.lang.Throwable分别映射成至.NET平台的System.Object、System.String和System.Exception结构。

IKVM.OpenJDK.ClassLibrary.dll是通过Java基础类库映射成的.NET类库,该类库继承自OpenJDK类库。

IKVM.AWT.WinForms.dll是通过Java中AWT翻译过来的.NET窗口程序开发版本。

ikvm.exe是一个动态编译器,相当java.exe,用于在.NET平台中构建一个Java运行时,动态模式通过这个运行时实现。

ikvmc.exe是一个静态编译器,用来把Java类和jar包编译成.NET程序集,也就是上文说的静态模式。

ikvmstub.exe是一个映射工具,决定如何从Java类型到.NET类型的关系映射库。

IKVM.NET在windows和linux上的安装都很简单,下载 IKVM.NET发布的可执行程序(本文末尾提供下载),直接解压至ikvm目录,在windows系统中,通过cmd进入命令行,通过cd命令将当前目录切换到ikvm文件夹下的bin目录,直接输入〖ikvm〗命令,你将看到如下输出:

usage: ikvm [-options] [args...] (to execute a class) or ikvm -jar [-options] [args...] (to execute a jar file)

当然为了操作的方便,您也可以将ikvm下的bin目录设置成系统环境变量,下一次运行将不通过cd切换,直接键入命令,但这不是必须的。通过执行ikvm命令,相当于创建了一个Java运行时,你可以根据上面的命令提示选择执行一个Java类或者Jar包。

为了动态运行一个Java应用程序,首先使用javac编译一个jar文件,以便于下面的测试,编译命令如下:

javac Hello jar cfm hello.jar manifest.mf Hello.class

下面我们就使用ikvm命令运行创建一个java运行时,并让运行时执行上面生成的java包:

ikvm Hello

使用ikvmc命令,指定〖-out〗选项,可将一个jar包转换成基于.NET平台的dll程序集或者exe可执行程序:

ikvmc -out:output.dll input.jar ikvmc -out:output.exe input.jar

现在,你可以直接在.NET项目中引用output.dll,并调用java代码,这如同您调用C#代码一样,如果jar本身是个可执行文件,转换后的output.exe也可直接运行,当运行output.exe时,系统可能会抛出一个名为FileNotFoundException的异常,这是因为.NET运行时未能加载IKVM.OpenJDK.ClassLibrary.dll导致,如果出现这种异常,你需要将IKVM.OpenJDK.ClassLibrary.dll拷贝到应用output.exe的根目录。

零度总结:本文只介绍了在.NET中使用Java代码的方法,其实IKVM.NET也支持在Java中复用.NET代码,虽然这一切的想法总是好的,但实际开发中很少能够找到高级语言之间复用代码的场景,加之IKVM.NET未完善,这使得IKVM.NET的发展受到制约,但这不排除IKVM.NET就无用武之地,至少它让跨语言复用成为可能,比如谷歌高质量的JavaScript压缩器使用Java编写,就可通过IKVM.NET翻译一个.NET版本,从而发挥.NET平台的优势,总之,复用总比不复用好。

以上就是零度为您带来的.NET平台运行Java代码的解决方案,关于本文提到的框架、工具和资源,请点击下面链接下载。

零度下载