当前位置:文档之家› java调用C#封装的dll方法

java调用C#封装的dll方法

Java调用C# DLL的方法简介
By 潘伟2012-8-7
关于java调用C# 封装的DLL文件的方法
第一种:java利用JNA进行调用
思路:C#源码生成COM组件(dll和tlb文件),再利用C++进行封装,java通过JNA调用C++封装的DLL。

第二种:java利用jacob进行调用
第一种java利用JNA调用C# DLL
需安装Visual Studio 2010 ,下载jna.jar(解压放置于jdk_home/jre/lib/ext目录下)。

第一步:利用C#写COM组件
1、新建一个类库项目(文件—新建—项目—类库;命名:COMTest);//根据实际需要取文件名
2、生成.cs主文件;
COMTestClass.cs
3、右键点击工程->应用程序->程序集信息->使程序集com可见,打上勾
4、右键点击工程->生成->为com Interop注册打上勾
5、设置强签名
(由于.Net下编译的COM组件并等同于C编译的COM组件,所以存在必须在运行目标机器注册的情况,对此.Net下编译的COM组件必须为程序进行签名,即强命名密钥;)
打开Visual Studio Command Prompt 输入:sn -k MyKeyFire.snk 生成MyKeyFire.snk 文件,注意路径。

(.snk文件可以随意取,但.snk后缀名别忘记了)
在签名标签中选中为程序集签名,选择刚刚生成的强名称文件MyKeyFire.snk 。

6、在“解决方案资源管理器”中找到节点“Properties”打开AssemblyInfo.cs文件
如下图
7、将[assembly: ComVisible(false)]属性改成[assembly: ComVisible(true)]
如下图
8、编译程序,\bin\Debug目录中会生成COMTest.dll 和COMTest.tlb文件。

第二步:利用C++进行再封装
1、创建C++ DLL项目,新建项目->VC++->Win32 项目(名称:COMTest_Bridge)->下一步->应用程
序类型:DLL
2、添加类,类名:COMTest_Bridge,.h名:COMTest_Bridge.h,.cpp名:COMTest_Bridge.cpp,
然后生成项目;
3、把第一步生成的COMTest.dll 和COMTest.tlb文件放入C++项目下的Debug文件夹下。

4、注册COM组件:
4.1打开Visual Studio Command Prompt进入Debug目录,运行命令注册:
gacutil -i .dll全文件名;regasm .dll全文件名;
5、编辑COMTest_Bridge.h和COMTest_Bridge.cpp文件:
COMTest_Bridge.h
// COMTest_Bridge.h
#pragma once
#define DLL_EXPORT extern"C"__declspec(dllexport)
DLL_EXPORT int CPPadd(int a,int b);
DLL_EXPORT void CPPsay(char* str);
DLL_EXPORT bool isCOM1(char* portName);
COMTest_Bridge.cpp
注意:
1)、基本类型转换对应时。

C#和java 中的String对应于C++的char*及COM组件中的_bstr_t;
2)、注意按顺序引用头文件,否则无法编译
// COMTest_Bridge.cpp :
// Dies ist die Haupt-DLL.
#include"stdafx.h"
#include<iostream>
#include< string >
#include"COMTest_Bridge.h"
#import"..\Debug\COMTest.tlb"
using namespace std;
using namespace System;
using namespace COMTest;
int CPPadd(int a,int b){
HRESULT com=CoInitialize(NULL);
COMTestIfcePtr comTest(__uuidof(COMTestClass));
int result = comTest->add(a,b);
CoUninitialize();
return result;
}
void CPPsay(char* str){
HRESULT com=CoInitialize(NULL);
COMTestIfcePtr comTest(__uuidof(COMTestClass));
comTest->say(str);
CoUninitialize();
}
bool isCOM1(char* portName){
HRESULT com=CoInitialize(NULL);
COMTestIfcePtr comTest(__uuidof(COMTestClass));
bool result = comTest->isCOM1(portName);
CoUninitialize();
return result;
}
注意:项目启用公共语言运行时支持(/clr),否则C++无法调用托管的C# dll。

如图:6、重新生成项目。

得到COMTest_Bridge.dll文件
第三步java调用C++ DLL
1、创建java项目,添加C++ DLL到项目下;
2、添加jna.jar包到jdk1.6\jre\lib\ext下
3、创建接口:ICOMTest_Bridge(名字和C++ DLL 名字一致);
4、创建类:COMTest_Start:
第二种java 通过Jacob调用
同第一种,需安装Visual Studio 2010 ,下载jacob.jar和jacob-1.16-M1-x86.dll()
第一步:利用C#写COM组件
(完全同第一种方法的第一步,此处省略)
第二步:java调用C++ DLL
1、在开发环境中引入jacob.jar (解压放置于jdk_home/jre/lib/ext目录下);
2、拷贝jacob-1.16-M1-x86.dll文件到C:\Windows\System32目录,如果是Web应用的话还需要拷
贝到jdk1. 6\bin目录(jdk安装目录下的bin目录)
3、注册C# 生成的COM组件(COMTest.dll 、COMTest.tlb):注册方法同上第二部分的
4、Java调用C# dll类实现:
package jacob;
import com.jacob.activeX.ActiveXComponent;
import .Dispatch;
import .Variant;
public class ComTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a = 35;
int b = 23;
String info = "hello world!";
try {
ActiveXComponent dotnetCom = null;
dotnetCom = new ActiveXComponent("TestClass"); // COMTest命名空间,COMTestCLass类名
Variant var = Dispatch.call(dotnetCom, "CPPadd", a, b);
Dispatch.call(dotnetCom, "CPPsay", info);//调用say方法
String str = var.toString(); // 返回值
System.out.println("str: " + str);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
5、注意事项:
1)、dotnetCom = new ActiveXComponent("TestClass");注意正确映
射GUID,否则报错找不到映射类,解决方式:在注册表中查看相应类名
例如:运行->regedit->HKEY_CLASSES_ROOT->TestClass。

相关主题