使用IKVM 8 实现 jar转dll

首先下载jar包对应的IKVM工具,低版本的jar可以适配高版本的IKVM工具,此处使用IKVM8-1版本,具体下载地址:http://weblog.ikvm.net/

参考网址:http://www.aiuxian.com/article/p-481908.html

使用IKVM 8 实现 jar转dll_第1张图片

 

转换过程:

CMD进入bin目录下:

执行转换命令:

ikvmc -out:E:\zhibei\jyf\dependency\otldb.dll E:\zhibei\jyf\dependency\otldb.jar -reference:E:\zhibei\jyf\dependency\jsqlparser.dll

此处的jsqlparser.dll已经从jar包转换成dll

生成jsqlparser:

ikvmc -out:
E:\zhibei\jyf\dependency\jsqlparser.dll E:\zhibei\jyf\dependency\jsqlparser-1.0-ZHIBEI.jar

再将dll重签名:

生成snk秘钥(打开VS的command prompt)

(此处需要备份dll)

sn -k E:\zhibei\jyf\dependency\重签名\jsqlparser.dll
sn -p E:\zhibei\jyf\dependency\重签名\jsqlparser.dll E:\zhibei\jyf\dependency\重签名\jsqlparser.snk
sn -t E:\zhibei\jyf\dependency\重签名\jsqlparser.snk

将dll重签名

cd C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools
ildasm.exe E:\zhibei\jyf\dependency\jsqlparser.dll /out=E:\zhibei\jyf\dependency\jsqlparser.il
cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
ilasm.exe E:\zhibei\jyf\dependency\jsqlparser.il /dll /resource=E:\zhibei\jyf\dependency\jsqlparser.res /key=E:\zhibei\jyf\dependency\jsqlparser.snk /optimize

同上将转换后的otldb.dll 也进行重签名

先获取秘钥,再签名

cd C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools
ildasm.exe E:\zhibei\jyf\dependency\otldb.dll /out=E:\zhibei\jyf\dependency\otldb.il
cd C:\Windows\Microsoft.NET\Framework\v2.0.50727
ilasm.exe E:\zhibei\jyf\dependency\otldb.il /dll /resource=E:\zhibei\jyf\dependency\otldb.res /key=E:\zhibei\jyf\dependency\otldb.snk /optimize

C#中引用dll

Jar转过去的dll都需要重签名

再者引用:在IKVM中的bin下:此为C#版的JVM环境

引用之后,会报错

使用IKVM 8 实现 jar转dll_第2张图片

错误关键提示:

java.lang.ClassCastException: 无法将类型为“java.util.PropertyResourceBundle”的对象强制转换为类型“sun.util.resources.OpenListResourceBundle”。

 解决方案:把IKVM 中lib下的所有dll复制到项目的BIN DEBUG/Release下。

注:

       IKVM 常见命令参数:

-target:目标类型----指定生成目标.exe或.dll文件的类型,可以指定如下值:

      exe——生成一个在windows命令窗口中运行的可执行程序。 
      winexe——生成一个带有界面的.exe应用程序。 
       library——生成一个动态链接库(.dll)文件。 
       module——生成一个.net模块。 
       在Linux平台上,exe与winexe两个参数是没有区别的。

-reference:----指定类库位置 。 如果Java代码使用了.NET的编程接口(API),那么使用这个选项指定这些动态链接库(dll)。如果引用了不止一个类库文件,那么此选项可以多次使用。可以使用通配符(例如:c:\libs\*.dll)。

 

** 如果某个工程改变,请重新生成签名秘钥

你可能感兴趣的:(混合编程)