利用jacob实现java调用C#生成的DLL
写在前面
本文为学习记录,参考链接如下:
java Jacob调用VB编写的DLL(COM组件)
Java调用C# dll jacob
Java运行jacob文件中jacob-1.17.dll
一.下载Jacob包并生成签名
1.下载Jacob包
由于官网中的项目已经进行了迁移,我这里直接在网上找了下载了以前的版本,下载链接为:jacob-1.17
下载解压之后,将文件中的jacob-1.17-M2-x64.dll放到你电脑C:\Windows\SysWOW64文件夹中(64位系统),将文件中的jacob-1.17-M2-x86.dll放到C:\Windows\System32文件夹中(32位系统)。
2.生成签名
(1)以管理员身份打开Developer Command Prompt for VS 2019,并输入以下命令
key:sn -k MyKeyFire.snk
(2)64位系统生成的签名文件一般在C:\Windows\SysWOW64文件夹中,将其复制到其它路径下。
二.在IntelliJ Idea中调用C#生成的DLL
1.vs2019中创建C#类库
(1)以管理员身份打开vs2019(注意:这里一定要用管理员身份打开),创建类库,类库名为ClassLibrary1(自己命名)。
(2)在Class.cs中添加如下代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ClassLibrary1
{
public interface IHelloWorld
{
string say(string s);
}
public class HelloWorld : IHelloWorld
{
public HelloWorld() { }
public string say(string s)
{
return "test " + s;
}
}
}
(3)配置相关属性
右击项目名,选择属性:
1)应用程序–>程序集信息,勾选使程序集COM可见
2)生成–>目标平台选AnyCPU;生成–>勾选为COM互操作注册
3)签名–>勾选为程序集签名,选择刚刚生成的强签名文件
编译程序,在debug目录下会生成ClassLibrary1.dll 和ClassLibrary1.tlb
(4)进行注册
回到Visual 中自带命令工具,类似cmd的,进入Debug目录,运行注册命令:
regasm ClassLibrary1.dll /tlb:ClassLibrary1.tlb
gacutil -i ClassLibrary1.dll
3.IntelliJ Idea中引入jacob.jar包并测试
(1)创建java项目
(2)引入jacob.jar包
添加如下代码:
package com.company;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class Main {
public static void main(String[] args) {
// write your code here
ActiveXComponent xl = new ActiveXComponent("Excel.Application");
Dispatch xlo = (Dispatch)(xl.getObject());
try {
System.out.println("version="+xl.getProperty("Version"));
System.out.println("version="+Dispatch.get(xlo, "Version"));
} catch (Exception e) {
e.printStackTrace();
} finally {
xl.invoke("Quit", new Variant[] {});
}
}
}
运行测试结果如下,表示环境配置成功。
4.IntelliJ Idea中调用C#生成的DLL
添加如下代码:
package com.company;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
public class Main {
public static void main(String[] args) {
// write your code here
try{
ActiveXComponent dotnetCom =new ActiveXComponent("ClassLibrary1.HelloWorld");
Variant var = Dispatch.call(dotnetCom,"say","hello world");
String str = var.toString();
System.out.println(str);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}