工具箱之 IKVM.NET 项目新进展

01503f954b4b2ae5143f7d8041fc42c1.jpeg在各种群里经常讨论的一个事情是.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-revived/ikvm)[2],现在完全可以支持.NET 6了:

7fde11bf90d0fe03ff0cb2e83015c5fd.png

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一天一种设计模式之六-----工厂方法模式

2019独角兽企业重金招聘Python工程师标准>>> 一.工厂方法模式 工厂方法模式属于创建型模式。工厂方法模式定义&#xff1a;定义一个用于创建对象的借口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到了他的子类。一般工厂类会有一个工厂的接…

[转]IPython介绍

1. IPython介绍 ipython是一个python的交互式shell&#xff0c;比默认的python shell好用得多&#xff0c;支持变量自动补全&#xff0c;自动缩进&#xff0c;支持bash shell命令&#xff0c;内置了许多很有用的功能和函数。学习ipython将会让我们以一种更高的效率来使用python…

.NET MAUI in Mac

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;4分钟&#xff09;概要本篇文章主要分享MAUI在m1芯片的设备上运行和支持情况&#xff0c;将我们写好的MAUI程序编译为支持mac平台的版本。在m1芯片刚刚出来的时候有很多开发工具和应用程序对m1芯片的支持不是很友好&a…

前端开发中的SEO

前端开发中的SEO 什么是SEO SEO由英文Search Engine Optimization缩写而来&#xff0c;中文意译为“搜索引擎优化”。SEO是指从自然搜索结果获得网站流量的技术和过程&#xff0c;是在了解搜索引擎自然排名机制的基础上&#xff0c;对网站进行内部及外部的调整优化&#xff0c;…

C# 自定义并动态切换光标

本文经原作者授权以原创方式二次分享&#xff0c;欢迎转载、分享。原文作者&#xff1a;唐宋元明清的博客原文地址&#xff1a;https://www.cnblogs.com/kybs0/p/14873136.html系统有很多光标类型 &#xff1a;Cursors 类 (System.Windows.Input) | Microsoft Docs[1]本章介绍如…

视频播放器for android

写在前面 好久没有写博客了, 中间忙了一堆杂七杂八的事情...工作, 情感, 未来, 人生... 下面是正文 一直要写一个视频播放器, 好练练手. 这个app, 从年前写到现在, 终于算弄出了样子, 0.0版本. (不得不说, googleVPN值得拥有, android developer网站, android sdk samples, sta…

简单粗暴无需拼接下载 blob (ts)视频文件

网上很多视频采用blob来播放视频&#xff0c;查看源码会发现video的src为形如 &#xff1a; src"blob:https://*/f2880c6a-c2c5-4146-96b2-944ae555b76a" <video id"" class"" preload"auto" playsinline"playsinline"…

Shell重定向

Liunx下系统打开的3个文件&#xff0c;即标准输入、标注输出和标准错误输出。用户的shell将键盘设为默认的标准输入&#xff0c;默认的标准输入和标准错误输出为屏幕。也就是说&#xff0c;用户从键盘输入命令&#xff0c;然后将结果和错误消息输入到屏幕所谓的重定向&#xff…

【CASS精品教程】CASS 9.2 for AutoCAD2014启动提示文件加载,怎么处理?

CASS9.2在安装完后,首次启动会提示如下图样提示,应该如何处理?请看以下步骤: 解决步骤: 1、安装完CASS9.2_2014后,首次启动CASS92,会出现如下图所示提示。选择“不加载”。 2、进入AutoCAD系统配置—系统页面 打开系统页面菜单 系统界面截图

VS2015不能修改安装路径问题

能修改安装路径&#xff0c;固态硬盘空间太小&#xff0c;所以不能装在C盘啊。 其中&#xff0c;原因是以前安装过VS2015没有卸载干净&#xff0c;解决方法是&#xff1a;下载Visual Studio Uninstaller卸载完全&#xff08;要以管理员运行哈&#xff09; 下载地址&#xff1a;…

python 绘制分形树

# -*- coding: utf8 -*- """ 绘制分形树 """ import turtledeflection_angle 20 # 树枝与树干夹角 trunk_min_length 5 # 树干最小长度 trunk_step_length 10 # 树干每次递减长度 trunk_length 80 # 初…

像JAVA一样流畅调试C#源代码?

起因最近在研究ServiceScope的内一些内在运行逻辑,发现相关资料非常少&#xff0c;只有讲IOC相关的文章有说Core时代的官方依赖注入怎么使用。。遂决定还是要去看源代码。这部分源代码在Microsoft.Extensions.DependencyInjection库中&#xff0c;源代码位置在src/libraries[1]…

物化视图VS普通视图

2019独角兽企业重金招聘Python工程师标准>>> 物化视图是一种特殊的物理表&#xff0c;“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表&#xff0c;应用的局限性大&#xff0c;任何对视图的查询&#xff0c;Oracle都实际上转换为视图SQL语句的查…

EditPlust 批量添加自定义工具

先将插件文件***.js文件放到指定目录&#xff0c;比如editplus的安装下新文件夹tools。 &#xff08;下载地址见文末&#xff09; 将下列代码内容另存为tool_u.ini 文件&#xff08;不能改名&#xff09;&#xff0c; 放到EditPlus 的ini文件目录 &#xff08;工具-设置目录 可…

iOS c语言 基本运算符

2019独角兽企业重金招聘Python工程师标准>>> iOS_06_基本运算符 一、算术运算 c语言一共有34种运算符&#xff0c;包括了常见的加减乘除 1.加法运算 # 除了能做加法运算&#xff0c;还能表示正号&#xff1a;5、90 2.减法运算- # 除了能做减法运算&#xff0c;还能表…

Maui学习之路(三)--Winui3深入探讨

Maui的学习之路 --- Winui3深入探讨学习Maui已经有一段时间&#xff0c;随着不断地深入&#xff0c;对Maui有了一些初步的了解。我们都知道Maui为了保持平台原生特性&#xff0c;所以在每一个平台都使用了平台自身的原生开发框架&#xff0c;如在Windows系统使用了Winui3作为UI…

centos 7.1 apache 源码编译安装

Apache编译安装 一&#xff0c;需要软件&#xff1a; http://mirrors.cnnic.cn/apache//apr/apr-1.5.2.tar.gz 1.apr-1.5.2.tar.gz http://mirrors.cnnic.cn/apache//apr/apr-util-1.5.4.tar.gz 2.apr-util-1.5.4.tar.gz http://exim.mirror.fr/pcre/pcre-8.38.tar.gz 3.pcre-8…

通过两级网关设计来路由服务网格流量

编者的话本文是来自笔者的公司 Tetrate[1] 工程师 Petr McAllister 的分享&#xff0c;Tetrate 的拳头产品是 Tetrate Service Bridge[2]&#xff08;下文简称 TSB&#xff09;&#xff0c;它是在开源的 Istio 和 Envoy 基础上构建的&#xff0c;但为其增加了管理平面。简介Tet…

H5开发中常用的js方法

2019独角兽企业重金招聘Python工程师标准>>> h5和app之间的webview交互 这是常用的交互方法之一&#xff0c;iOS可以使用WKWebView,安卓可以使用JsBridge,完成常见的交互效果。function webViewHandler(iosCallback, adrCallback) {if (getMobileOperatingSystem() …

GPS RTK(银河1)基准站架设、移动站设置完整操作流程

本文讲解GPS RTK(银河1)基站架设完整操作流程,包括相对坐标、点校正等操作。 文章目录 一、架设基准站二、启动基准站三、架设移动站四、设置移动站一、架设基准站 基准站一定要架设在视野比较开阔,周围环境比较空旷的地方,地势比较高的地方;避免架在高压输变电设备附近…