用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,我才能认识他们

解决方案

  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编译器的版本

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

用IKVMC将jar转成dll供c#调用的更多相关文章

  1. Go 程序编译成 DLL 供 C# 调用。

    Go 程序编译成 DLL 供 C# 调用. C# 结合 Golang 开发   1. 实现方式与语法形式 基本方式:将 Go 程序编译成 DLL 供 C# 调用. 1.1 Go代码 注意:代码中 ex ...

  2. Matlab函数编译成dll供c调用

    一 编译dll 在Command Window窗口中输入mbuild -setup,然后会出现语句,是否安装编译器,选择n,因为机子上已经安装了C/C++/C#的编译器,选择VS2010.

  3. java生成jar并用ikvm生成dll供C#调用

    最近想尝试用C#做NB_IOT北向API接口的访问.北向API的接口的访问需要证书的双向认证,而C#不支持双向认证,所以就使用IKVM在C#中跑JAVA程序实现HTTPS请求部分. 步骤如下: 一.使 ...

  4. Delphi编写DLL供C#调用的实例

    Delphi中编写的Dll: library TestDLL; { Important note about DLL memory management: ShareMem must be the f ...

  5. [笔记]Delphi 2007写DLL供VC调用实例

    考虑如下几种常用情况: - VC传入int,返回int- VC传入char *,返回int- VC传入char *,返回char *及int 为简化问题,传递的字符串参数只考虑ANSI格式,不考虑UN ...

  6. Jar包转成Dll的方式(带嵌套的jar也能做) (转)

    研究很好几天,终于成功了.因为写了一个Java的项目,现在要求要改写成C#版本的.但是其中用到了svnkit,svnkit是java平台的.改写成C#的话,要使用SharpSVN,但是SharpSVN ...

  7. Jar包转成Dll的方式(带嵌套的jar也能做)

    研究很好几天,终于成功了.因为写了一个Java的项目,现在要求要改写成C#版本的.但是其中用到了svnkit,svnkit是java平台的.改写成C#的话,要使用SharpSVN,但是SharpSVN ...

  8. jre1.8使用ikvm.net8将jar转换为dll以供c#调用

    由于合作方使用.net编程,jar包不能用,需要转换成dll格式,来回转换了十几个dll文件,终于生成了一个可用的.在这里将走过的弯弯绕绕总结下,希望遇到相似问题的同好们,能走得顺利些. 版本问题: ...

  9. 在jre1.8版本下,使用ikvm将jar转换为dll,以供c#调用

    由于合作方使用.net编程,jar包不能用,需要转换成dll格式,来回转换了十几个dll文件(心塞..),终于生成了一个可用的.在这里将走过的弯弯绕绕总结下,希望遇到相似问题的同好们,能走得顺利些. ...

随机推荐

  1. ylbtech-LanguageSamples-Struct(结构)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Struct(结构) 1.A,示例(Sample) 返回顶部 “结构”示例 本示例演示结 ...

  2. (Delphi) Windows 32 API程序设计目录

    这里所有程序均使用Delphi调用Windows 32 API方式实现,并不是使用VCL已经封装好的类实现的! (一)第一个窗口程序 01 创建第一个窗口.

  3. 拥抱高效、拥抱 Bugtags 之来自用户的声音

    小编按:这是一篇 Bugtags 用户来稿,主要是介绍了 Bugtags 使用的方法及其带来的效率的提升,谢谢介博同学对 Bugtags 的信赖和支持.小编在这里诚邀各位热心用户向我们投稿,说出你使用 ...

  4. Spring读取配置文件

    在spring中可以通过下面的方式将配置文件中的项注入到配置中 <bean class="org.springframework.beans.factory.config.Proper ...

  5. C++学习12 友元函数和友元类

    友元函数和友元类在实际开发中较少使用,想快速学习C++的读者可以跳过本节. 一个类中可以有 public.protected.private 三种属性的成员,通过对象可以访问 public 成员,只有 ...

  6. Java中Split函数的用法技巧

    在java.lang包中也有String.split()方法,与.net的类似,都是返回是一个字符型数组,但使用过程中还有一些小技巧.如执行:"2|33|4".split(&quo ...

  7. 编译 proto 文件到指定语言的代码

    由于 Protocol Buffers 3 的正式版还没有发布,在官网(https://developers.google.com/protocol-buffers/docs/downloads)目前 ...

  8. mm

    1. 实施例子  http://wenku.baidu.com/view/d01d951dfad6195f312ba6e8.html 2. internal number range即内部给号,指系统 ...

  9. [HDU 5090] Game with Pearls (贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5090 题目大意:给你n个数,问你给若干个数增加c*k(c>=0)能否组成1,2,3,4,5,.. ...

  10. 慕课网-安卓工程师初养成-3-4 Java中的比较运算符

    来源:http://www.imooc.com/code/1299 比较运算符用于判断两个数据的大小,例如:大于.等于.不等于.比较的结果是一个布尔值( true 或 false ). Java 中常 ...