陋室铭
永远也不要停下学习的脚步(大道至简至易)

posts - 2169,comments - 570,views - 413万

用IKVMC将jar转成dll供c#调用


前言

实习到现在所需要的工具类给的都是jar包,但是我需要在.net环境下去实现,如果重新下的话回合那麻烦,因此如果能将c#能够调用jar那就太棒了

ikvmc介绍

IKVMC可以将jar转成dll,到现在为止已经成功转换3个jar为dll,期间碰壁无数,在此写下此篇文章希望能帮助到有需要的人。

ikvmc下载安装

下载并解压

这并没有什么很大问题,下载压缩包解压出来,解压出来的主要文件在bin目录下
解压

设置环境变量

在win8.1/win10下的步骤如下:

  1. 通过 计算机/此电脑(根据系统名称而不同)右击->属性->高级系统设置->环境变量
  2. 找到系统变量下面的path添加路径如_C:\ikvmc-XXX\bin\;_
  3. 运行命令行cmd,输入ikvmc查看帮助

cmd-ikvmc

输出如图所示,则准备工作已经完成

jar->dll

常用参数说明

  • -target:library
    使用方法:ikvmc -target:library a.jar

    由于我们的目的是把jar转为dll,此参数就是此作用

  • -reference:<filespec>(-r:<filespec>)
    使用方法: ikvmc -target:library a.jar -r:b.dll

    该方法作用若a.jar存在第三方的引用,则我们需要指明需要引用的dll

具体操作

注意:大多实际情况其实会很复杂,其实转换一个jar包,并不是一句代码就可以转换的,大多数的jar包会调用很多其他的包,这就需要做很多工作
我在这里举个实际例子

  • 首先了解下项目的大致结构
    这里有很多依赖项,但是真正需要的包为圈出来的三个
    项目结构
    所以我们先尝试将这三个包转化为dll,最后在转化这个包并指明需要引入的dll

  • 尝试转换为dll

cd 进入到我文件目录,使用ikvmc -target:library xxx.jar命令转换为dll
如果你并没有ikvmc使用的经验那么,接下来的情况可能会让人无语

15
此图的意思是有些类没找到,有些类引用错误等

16
这幅图看到不用怕,并不是什么错误,而是一些警告,他说:兄弟 你编译的这些东西我都已经集成了在XXX中了,所以还是会转化成功

17
这幅图和第一个转化的结果一样许多class没引用,很多引用错误

以上的错误解决方法就是:指明需要引用的'包'(实际是dll)
看不懂什么意思?也就是说:嘿,我不知道你引用的是什么,你需要先把他转化成dll,然后再引用这些dll,我才能认识他们

解决方案

  1. 第二个包已经转化成功,直接用ikvmc -target:library xxx.jar -r:xxx.dll添加引用即可

  2. 2个找不到类和引用错误的包我们需要将他所引用的jar包先转为dll
    但是这里又是一个问题:
    A->B A-> F B->C B->D D->E .....
    可能会出现这种情况A依赖B包F包 B包依赖C包D包 D包又依赖于E包。。。
    如果碰到这种情况:我给你2个建议,

    • 第一个是一直找下去 找到最低层的包为止,将其转化,再一层层转化上来
    • 若某些方法调用了其他包的方法,而这些方法我我们又不需要用,那留着干什么,何不把他干掉更轻松愉快
  3. 若问题如上所示,找到你所需要掉用的核心代码,该代码所需要jar包,我找到的就是那三个jar,其他的都无关紧要下载反编译工具,通过反编译jar包为java,再提取核心代码变成回jar包,这里只能靠你自己的聪明才智了

    这是我新建的一个工具项目,InfoXX.jar可以直接引用,其他2个包又依赖了别的包,我删除了无关紧要的代码移除了依赖项,最后通过Export导出即可

再处理以上问题你所花的时间我相信会占用整个处理过程大部分时间,不要觉得烦,通常情况,你并不是把整个项目转化为.net项目,而是某些功能需要调用java的代码,所以情况不会太悲观
这是我导出的jar包,注意下导出的时候无需勾选libs下的依赖jar包,我们通过将依赖jar包转化为dll,显示的指定,所以无需一起导出

最后通过ikvmc -target:library xx.jar -r:xx.dll进行转化,转化成功的如图所示,未弹出任何错误以及警告,若弹出了错误和警告dll依然会生成但是你在.net调用可能会报错

最后需要提非常重要的一点,有些人什么都喜欢用新的东西(比如我),但是ikvmc似乎不支持太高版本编译出的jar包(如1.8),如果一切都已经做很到位,但是还是导出dll失败,可以尝试降低java编译器的版本

希望此篇文章能给和我一样走过坑的人一点帮助

posted on   宏宇  阅读(563)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2018-07-23 (c#) 销毁资源和释放内存
2018-07-23 C#中 ThreadStart和ParameterizedThreadStart区别
2018-07-23 MongoDB的C#封装类
2018-07-23 mongo DB for C#
2018-07-23 C#操作MongoDB
2018-07-23 关于Mongodb的全面总结
2018-07-23 Mongodb下载、安装、配置与使用
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示