关于.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中武官网 ~

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理