在各种群里经常讨论的一个事情是.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 Framework的编译器,而 Mono 是 .NET Framework的开源、跨平台版本。2017年IKVM.NET作者决定放弃IKVM.NET的开发工作,从此之后社区里有人分叉了IKVM.NET 并继续工作,虽然开发工作不是很积极, 不过从2022年3月份至今开发就非常活跃了(https://github.com/ikvm-revived/ikvm)[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/shanyou/articles/343118.html

[2]ikvm Github复活仓库: https://github.com/ikvm-revived/ikvm

[3]OpenJDK: http://openjdk.java.net/

[4]IkvmReference 设计方案:https://github.com/ikvm-revived/ikvm/issues/54

工具箱之 IKVM.NET 项目新进展的更多相关文章

  1. iOS开发实用技巧—项目新特性页面的处理

    iOS开发实用技巧篇—项目新特性页面的处理 说明:本文主要说明在项目开发中会涉及到的最最简单的新特性界面(实用UIScrollView展示多张图片的轮播)的处理. 代码示例: 新建一个专门的处理新特性 ...

  2. iOS中的项目新特性页面的处理

    一般项目中都会出现新特性页面,比如第一次使用应用的时候,或者在应用设置里查看新特性的时候会出现. 这里,选择新建一个专门处理项目新特性的控制器,来完成功能. 首先是 NewFeaturesViewCo ...

  3. 新项目新工作空间新仓库新setting文件

     maven项目涉及到仓库,本地jar包存放在本地仓库中,新项目新工作空间新仓库新setting文件,可以避免很多问题,不同项目工程的版本可能不一样,所涉及的jar包版本可能也不一样,不分开会有一些冲 ...

  4. 组装技术的新进展 New advances in sequence assembly.

    组装技术的新进展 1.测序和组装 很难想象今天距离提出测序和组装已经有40年啦.我们回头来看一下这个问题. “With modern fast sequencing techniques and su ...

  5. Neutron新进展|DragonFlow在Mitaka版本中的Roadmap

    OpenStack网络在Mitaka版本中将有哪些新变化?1月11日到12日,DragonFlow的PTL——Eran Gampel,Kuryr的PTL——Gal Sagie,和他们的老大从以色列来到 ...

  6. maven项目新检出后不编译爬坑记 及 mvn clean package报错 WagonTransporterFactory: java.util.NoSuchElementException 异常【我】

    从SVN新检出一个maven项目,配置好后,发现项目无法编译(只有一个test包中的代码显示编译报错,其他所有包中的代码都不编译,也不报错), 先注释掉报错的test包中的所有内容, 用Eclipse ...

  7. 项目新的需求,网页的自适应交付/响应式交付 Responsive/Adaptive Delivery

    网页为什么要做自适应交付,皆因现在移动设备大行其道,现在是移动互联网时代,以IOS及Android为首的各种移动终端已经遍地开花. 当人家用380px的iphone打开你的网页时,你总不能显示个102 ...

  8. JAVA WEB新进展

    哈哈,终于搞来页面来了,丑是丑,但是好的进展. 高手的思路,自己用库建连接池,确实利害. 最关键的一个HELPER代码: package org.smart4j.chapter2.helper; im ...

  9. idea 切换新项目 新窗口 原窗口

    选择 file--setting. 在新打开的窗口中选择 Appearance & Behavior--System Settings 点 Confirm window to open pro ...

随机推荐

  1. fs本地文件系统

    node 中有一个内置模块,fs全称flie system 文件系统,可以对本地文件执行增删改查操作(以下为异步相关API) 先引入内置模块   var fs=require('fs') 1,增: w ...

  2. Linux的软件安装tomcat 以及jdk

    因为tomcat的启动需要jdk,所以我们先安装jdk,安装完成后再安装tomcat 具体的文件大家可以到官网下载,下面介绍安装步骤 目录 jdk安装 1.通过xftp或者其他方式将安装包传到我们的L ...

  3. Arch Linux 安装简明流程

    Arch Linux 安装简明流程 这是一篇为 GPT/EFI 引导 的电脑安装 Arch Linux(双系统)的中文简明流程,尽可能省略了可以省略的流程与文字以使得篇幅尽量短小,基本上基于 Arch ...

  4. python学习-Day18

    目录 今日内容详细 模块 循环导入问题 判断文件类型 py文件可以被分为两种类型 内置变量 __ name __ 模块的查找顺序 验证先从内存空间中查找 验证再从内置模块中查找 验证sys.path ...

  5. .NET桌面程序集成Web网页开发的多种解决方案

    系列目录     [已更新最新开发文章,点击查看详细] B/S架构的Web程序几乎占据了应用软件的绝大多数市场,但是C/S架构的WinForm.WPF客户端程序依然具有很实用的价值,如设计类软件 Au ...

  6. 一篇文章教你搞懂日志采集利器 Filebeat

    关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 本文使用的Filebeat是7.7.0的版本,文章将从如下几个方面说明: Filebeat是什 ...

  7. gcc和g++是什么,有什么区别?

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 素材来源:C语言中文网 编辑整理:strongerHua ...

  8. 栈在go语言中实现,及解决388.文件的最长绝对路径的思路

    今天在LeetCode刷每日一题,遇到了388. 文件的最长绝对路径的思路,这道题让我想到了系统的目录是栈结构,果然在题解中找到了栈的解法(暴力半天没出来,跑去看题解了QWQ). 所以我就捎带复习了一 ...

  9. 基于Proxmox平台搭建3D云教室

    背景 本文介绍了在 Proxmox VE 虚拟化平台上使用NVIDIA A16 GPU,开启vGPU特性,利用DoraCloud 搭建3D云教室的方案. Proxmox virtualization ...

  10. iOS全埋点解决方案-数据存储

    前言 ​ SDK 需要把事件数据缓冲到本地,待符合一定策略再去同步数据. 一.数据存储策略 ​ 在 iOS 应用程序中,从 "数据缓冲在哪里" 这个纬度看,缓冲一般分两种类型. 内 ...