用IKVMC将jar转成dll供c#调用
用IKVMC将jar转成dll供c#调用
ikvmc c# dll jar
前言
实习到现在所需要的工具类给的都是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查看帮助

输出如图所示,则准备工作已经完成
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使用的经验那么,接下来的情况可能会让人无语

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

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

这幅图和第一个转化的结果一样许多class没引用,很多引用错误
以上的错误解决方法就是:指明需要引用的'包'(实际是dll)
看不懂什么意思?也就是说:嘿,我不知道你引用的是什么,你需要先把他转化成dll,然后再引用这些dll,我才能认识他们
解决方案
- 第二个包已经转化成功,直接用
ikvmc -target:library xxx.jar -r:xxx.dll添加引用即可 2个找不到类和引用错误的包我们需要将他所引用的jar包先转为dll
但是这里又是一个问题:
A->B A-> F B->C B->D D->E .....
可能会出现这种情况A依赖B包F包 B包依赖C包D包 D包又依赖于E包。。。
如果碰到这种情况:我给你2个建议,- 第一个是一直找下去 找到最低层的包为止,将其转化,再一层层转化上来
- 若某些方法调用了其他包的方法,而这些方法我我们又不需要用,那留着干什么,何不把他干掉更轻松愉快
若问题如上所示,找到你所需要掉用的核心代码,该代码所需要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编译器的版本
希望此篇文章能给和我一样走过坑的人一点帮助
用IKVMC将jar转成dll供c#调用的更多相关文章
- Go 程序编译成 DLL 供 C# 调用。
Go 程序编译成 DLL 供 C# 调用. C# 结合 Golang 开发 1. 实现方式与语法形式 基本方式:将 Go 程序编译成 DLL 供 C# 调用. 1.1 Go代码 注意:代码中 ex ...
- Matlab函数编译成dll供c调用
一 编译dll 在Command Window窗口中输入mbuild -setup,然后会出现语句,是否安装编译器,选择n,因为机子上已经安装了C/C++/C#的编译器,选择VS2010.
- java生成jar并用ikvm生成dll供C#调用
最近想尝试用C#做NB_IOT北向API接口的访问.北向API的接口的访问需要证书的双向认证,而C#不支持双向认证,所以就使用IKVM在C#中跑JAVA程序实现HTTPS请求部分. 步骤如下: 一.使 ...
- Delphi编写DLL供C#调用的实例
Delphi中编写的Dll: library TestDLL; { Important note about DLL memory management: ShareMem must be the f ...
- [笔记]Delphi 2007写DLL供VC调用实例
考虑如下几种常用情况: - VC传入int,返回int- VC传入char *,返回int- VC传入char *,返回char *及int 为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UN ...
- Jar包转成Dll的方式(带嵌套的jar也能做) (转)
研究很好几天,终于成功了.因为写了一个Java的项目,现在要求要改写成C#版本的.但是其中用到了svnkit,svnkit是java平台的.改写成C#的话,要使用SharpSVN,但是SharpSVN ...
- Jar包转成Dll的方式(带嵌套的jar也能做)
研究很好几天,终于成功了.因为写了一个Java的项目,现在要求要改写成C#版本的.但是其中用到了svnkit,svnkit是java平台的.改写成C#的话,要使用SharpSVN,但是SharpSVN ...
- jre1.8使用ikvm.net8将jar转换为dll以供c#调用
由于合作方使用.net编程,jar包不能用,需要转换成dll格式,来回转换了十几个dll文件,终于生成了一个可用的.在这里将走过的弯弯绕绕总结下,希望遇到相似问题的同好们,能走得顺利些. 版本问题: ...
- 在jre1.8版本下,使用ikvm将jar转换为dll,以供c#调用
由于合作方使用.net编程,jar包不能用,需要转换成dll格式,来回转换了十几个dll文件(心塞..),终于生成了一个可用的.在这里将走过的弯弯绕绕总结下,希望遇到相似问题的同好们,能走得顺利些. ...
随机推荐
- git相关网页
git.apache2.gerrit安装 1.http://blog.csdn.net/benkaoya/article/details/8680886 2.http://fatalove.iteye ...
- 《一课经济学》书摘笔记III
基本谬论:世界上可做的工作是有限的.用更有效率的方式去做事,只会消减工作机会.这个信条换句话说就是,采用低效率的方式去做一件事,反而可以创造工作机会. 只要还有人的需要或愿望还没有获得满足,能做的事就 ...
- crm 4 IFRAME 元素隐藏
function hidebtn(elementTitle) { var x = document.getElementsByTagName("LI"); for (i = 0; ...
- ppm与毫克/立方米怎么换算
ppm是溶液浓度(溶质质量分数)的一种表示方法,1升水溶液中有1毫克的溶质,g/m3或mg/L. 对于气体:,一百万体积的空气中所含污染物的体积数. 而按我国规定,特别是环保部门,则要求气体浓度以质量 ...
- Dubbo 通过Spring 配置具体启动服务
dubbo 服务的启动加载过程,请先看 : http://www.cnblogs.com/ghj1976/p/5316126.html 以 dubbo-demo-provider-2.5.4-SNA ...
- Redis链接上不的问题
问题描述: 同样配置的redis及系统环境,在两台服务器(A.B两台服务)上部署,但是其中一台(A),运行一段时间,就链接不上了,从开始运行redis到redis链接不上,这个时间间隔,不一定有时候是 ...
- Memcached、Redis和MongoDB的区别
Memcached和Redis都是内存数据库. Memcached是多线程运行的: Redis单线程是单线程运行的: MongoDB是文档型的非关系型数据库..Net:RavenDB.
- C#程序用Inno Setup打包,以管理员身份运行的处理方法
一.C#项目端的处理 目标:快捷方式有带盾的标识 在源码的Properties目录中找到 app.manifest,将其中level="asInvoker" 改成 level=&q ...
- CCJ PRML Study Note - Chapter 1.6 : Information Theory
Chapter 1.6 : Information Theory Chapter 1.6 : Information Theory Christopher M. Bishop, PRML, C ...
- Flex4 自定义分页组件
自己写的Flex4分页组件,去伪存真,只实现基本的分页功能,数据过滤神马的都不应该是分页组件干的活,有呆毛才有真相: [源代码下载] Flex自从转手给Apache后人气急跌,本人也很捉鸡,尽管Apa ...