乐趣区

关于.net:工具箱之-IKVMNET-项目新进展

在各种群里常常探讨的一个事件是.NET 如何调用 Java 的实现,最常见的场景之一就是在加解密方面 Java 提供的密钥,C# 无奈解密,C# 中 byte 范畴是[0,255],而 Java 中的 byte 范畴是[-128,127],因为明码生成器是 Java 所独有的,其它语言都不反对(IOS,ANDROID,C#,.NET 等),既然 Java 这么特立独行,咱们用上的解决方案那么就是 Java 范的。

Java 和.NET 是目前软件开发的两种次要技术,Java 8 尽管是一种较旧的技术,曾经实现了大量的工作。因而,当波及到可重用性时,在.NET 中应用在 Java 中创立的库是一种十分广泛的做法。假如您曾经在 Java 中开发了一个库,并且想要在 .NET 我的项目中应用它,那么 IKVM.NET 有助于在 .NET 中应用 Java 库。

这就是明天咱们要引入的配角 IKVM.NET , IKVM.NET 我的项目的历史十分悠久,早在 2006 年我在博客上写了一篇文章《在.NET 平台上运行 Java 程序 -IKVM.NET 入门》[1],IKVM.NET 和 Mono 一样都是.NET 开源史前的社区我的项目,IKVM 是一个 Java 到 .NET 的编译器,而 Mono 是 .NET Framework 的开源、跨平台版本。2017 年 IKVM.NET 作者决定放弃 IKVM.NET 的开发工作,从此之后社区里有人分叉了 IKVM.NET 并持续工作,尽管开发工作不是很踊跃,不过从 2022 年 3 月份至今开发就十分沉闷了(https://github.com/ikvm-reviv…)[2],当初齐全能够反对.NET 6 了。

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

  1. 在.NET 中实现的 Java 虚拟机:它有一个应用 C#.NET 开发的 JVM,它提供了字节码转换和验证,类加载等性能,以后反对 Java 8,这也是 Java 应用最多的版本。
  2. Java 类库的.NET 实现:它基本上应用 OpenJDK[3]我的项目来实现 JDK 库。
  3. 反对 Java 和 .NET 互操作性的工具:IKVM.NET 包含以下工具:
    a)ikvm:Java 虚拟机: 咱们能够将其与 java.exe(“动静模式”)进行比拟。它加载一个类文件并执行其 main 办法,如果咱们将类文件名作为参数传递,那么它将在可执行 jar 文件中执行 Java 代码。如果咱们将一个 jar 文件作为参数传递,那么它将执行它。
    b)ikvmc:将 Java 字节码编译为 CIL, 用于将 Java 类和 jar 编译为 .NET 程序集(“动态模式”)。此工具将 Java 字节码转换为 .NET DLL 和 exe。它将输出文件中的 Java 字节码转换为 .NET DLL。因而,当咱们传递多个 jar 文件和类文件时,它将将它们组合在一起并生成单个 exe 或 DLL 文件。是 exe 还是 DLL 取决于传递的类文件和 jar 文件是否具备 Main 办法。如果他们有一个 Main 办法,那么它将生成一个 exe,否则 DLL。
    c)ikvmstub:从 .NET 程序集生成 Java 存根类: 它从 .NET 程序集生成存根类文件,以便能够针对 .NET 代码编译 Java 代码。ikvmstub 工具从 .NET 程序集生成 Java 存根。ikvmstub 读取指定的程序集并生成一个蕴含 Java 接口和存根类的 Java jar 文件。

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 转换器。如果你有一个 Java 库,你想在.NET 应用程序中应用,而后运行“ikvmc -target:library mylib.jar”来创立“mylib.dll”。例如,Apache FOP 我的项目是一个用 Java 编写的开源 XSL-FO 处理器,宽泛用于从 XML 源生成 PDF 文档。借助 IKVM.NET 技术,Apache FOP 能够被任何.NET 应用程序应用。
  3. 用 Java 开发 .NET 应用程序 IKVM 为您提供了一种用 Java 开发 .NET 应用程序的办法。尽管 IKVM.NET 不包含用于.NET 的 Java 编译器,但您能够应用任何 Java 编译器将 Java 源代码编译为 JVM 字节码,而后应用“ikvmc -target:exe myapp.jar”来生成.NET 可执行文件。您甚至能够应用蕴含的 ikvmstub 应用程序在 Java 代码中应用 .NET API。

▌反对平台

  • NET Framework 4.6.1 及更高版本
  • NET Core 3.1 及更高版本
  • NET 5 及更高版本
  • Java SE 8

▌IkvmReference

IKVM 包含生成时反对将 Java 库转换为 .NET 程序集,这是最近退出的性能个性,具体能够参见 IkvmReference 设计方案[4]。在要援用 Java 库的我的项目中安装包。应用 IkvmReference 来批示您的我的项目须要哪些 Java 库。

例:

    <ItemGroup>
        <IkvmReference Include="..\..\ext\helloworld-2.0.jar" />
    </ItemGroup>

输入程序集将作为我的项目生成过程的一部分生成。能够向 IkvmReference 其余元数据增加以自定义生成的程序集。

  • Identity:我的项目的标识能够是 a)JAR 文件的门路 b)目录的门路或 c)其余不重要的名称。IkvmReference
  • AssemblyName:默认状况下,应用标准定义的规定生成。要笼罩此内容,请在此处执行此操作。AssemblyNameAutomatic-Module-Name
  • AssemblyVersion:默认状况下,应用标准定义的规定生成。要笼罩此内容,请在此处执行此操作。AssemblyVersionAutomatic-Module-Name
  • DisableAutoAssemblyName:如果禁用 检测。trueAssemblyName
  • DisableAutoAssemblyVersion:如果禁用 检测。trueAssemblyVersion
  • FallbackAssemblyName:如果未提供或无奈计算,请应用此值。AssemblyName
  • FallbackAssemblyVersion:如果未提供或无奈计算,请应用此值。AssemblyVersion
  • Compile:可选的以分号分隔的 Java 类门路项列表,以编译到程序集中。缺省状况下,如果我的项目的标识是现有的 JAR 文件或目录(尚不受反对),则此值是我的项目的值。反对 MSBuild 客户端援用多个 JAR 或.class 文件。Identity
  • Sources:在文档生成期间要应用的 Java 源文件的可选分号分隔列表。(尚不反对)
  • References:可选的以分号分隔的其余标识值列表,以指定为对以后标识值的援用。例如,如果依赖于,则将两者都作为项包含在内,但在 元数据上指定 的标识。IkvmReferencefoo.jarbar.jarIkvmReferencebar.jarReferencesfoo.jar
  • Debug:批示是否生成调试符号(不可移植)的可选布尔值。默认状况下,这是依据我的项目的整体设置确定的。
  • MSBuild 项组定义反对的所有其余元数据。Reference

IkvmReference 不可传递。将其蕴含在一个我的项目中并从第二个我的项目向该我的项目增加依赖项不会导致在第二个我的项目上提供雷同的援用。而是增加对每个我的项目的援用。

对于要解析为雷同生成的程序集的每个我的项目,请确保其设置雷同。

    <ItemGroup>
        <IkvmReference Include="helloworld.jar">
            <AssemblyVersion>1.0.0.0</AssemblyVersion>
        </IkvmReference>
        <IkvmReference Include="helloworld-2.jar">
            <AssemblyName>helloworld-2</AssemblyName>
            <AssemblyVersion>2.0.0.0</AssemblyVersion>
            <References>helloworld.jar</References>
            <Aliases>helloworld2</Aliases>
        </IkvmReference>
    </ItemGroup>

相干链接:

[1] 在.NET 平台上运行 Java 程序 -IKVM.NET 入门:
https://www.cnblogs.com/shany…
[2] ikvm Github 复活仓库:
https://github.com/ikvm-reviv…
[3] OpenJDK:
http://openjdk.java.net/
[4] IkvmReference 设计方案:
https://github.com/ikvm-reviv…


长按辨认二维码
关注微软中国 MSDN

点击返回.NET 中武官网 ~

退出移动版