用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. 基于HTML5的多张图片上传

    图片上传之前也有写过demo,不过是单张上传的,最近有个业务需求是需要多张上传的,于是乎从新改写了一下 HTML结构: 1 2 3 4 <div class="container&qu ...

  2. Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 --------------------------- ...

  3. jsp+javaBean 计算器实例

    package com.wzh.test.domain; import java.math.BigDecimal; public class CalculatorBean { private Stri ...

  4. iOS 加入自定义字体方法

    1.网上搜索字体文件(后缀名为.ttf,或.odf) 2.把字体库导入到工程的resouce中 3.在程序添加以下代码 输出所有字体 NSArray *familyNames = [UIFont fa ...

  5. Python深入05 装饰器

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 装饰器(decorator)是一种高级Python语法.装饰器可以对一个函数.方法 ...

  6. python 批量重命名文件后缀

    # batch_file_rename.py # Created: 6th August 2012 ''' This will batch rename a group of files in a g ...

  7. 使用matplot绘图 @python

    1. 使用csv 模块读取数据 2. 定义label 3. 绘图,调参 #!/usr/bin/env python # coding=utf-8 import sys import matplotli ...

  8. python 抓取javascript 动态数据

    1. 新安装一个python库 :~$ sudo pip install seleniumhq 2. 编写代码: 以获取百度百科点赞数为例 import selenium from selenium ...

  9. memcached命令行参数说明(转)

    1.启动Memcache 常用参数 -p <num>      设置TCP端口号(默认不设置为: 11211) -U <num>      UDP监听端口(默认: 11211, ...

  10. buildbot 自动启动

    buildbot的master或者slave,一般配置好了之后, 总希望永久可用,即使机器因为某些原因重启了,也会自动启动. 官网文档不推荐使用root启动master. 而是使用用户级别的cront ...