Java调用C# DLL的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
简介
关于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、 在“解决
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
资源管理器”中找到节点“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
SHAPE \* MERGEFORMAT
COMTest_Bridge.cpp
注意:
1)、基本类型转换对应时。C#和java 中的String对应于C++的char*及COM组件中的_bstr_t;
2)、注意按顺序引用头文件,否则无法编译
SHAPE \* MERGEFORMAT
注意:项目启用 公共语言运行时支持(/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 名字一致);
SHAPE \* MERGEFORMAT
4、 创建类:COMTest_Start:
SHAPE \* MERGEFORMAT
第二种 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类实现:
SHAPE \* MERGEFORMAT
5、 注意事项:
1)、dotnetCom = new ActiveXComponent("COMTest.COMTestClass");注意正确映射GUID,否则报错找不到映射类,解决方式:在注册
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
中查看相应类名
例如:运行->regedit-> HKEY_CLASSES_ROOT-> COMTest.COMTestClass
namespace COMTest
{
public interface COMTestIfce
{
int add(int a, int b);
void say( string str);
bool isCOM1(string portName);
};
public class COMTestClass : COMTestIfce
{
public int add(int a, int b)
{
return a + b;
}
public void say(string str)
{
Console.WriteLine(str);
}
public bool isCOM1(string portName)
{
if (portName.Equals("COM1"))
{
Console.WriteLine("1true");
return true;
}
else
{
Console.WriteLine("2false");
return false;
}
}
}
}
// 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 :
// Dies ist die Haupt-DLL.
#include "stdafx.h"
#include
#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;
}
package jna;
import com.sun.jna.Library;
public interface ICOMTest_Bridge extends Library {
int CPPadd(int a, int b);
void CPPsay(String str);
boolean isCOM1(String portName);
}
package jna;
import com.sun.jna.Native;
public class COMTest_Start {
static int a = 5;
static int b = 4;
static String Str = "转告波仔:打印中文字符!";
static String portName = "COM1";
public static void main(String[] args) {
ICOMTest_Bridge instance = (ICOMTest_Bridge) Native.loadLibrary(
"dll/COMTest_Bridge", ICOMTest_Bridge.class);
int m = instance.CPPadd(a, b);
System.out.println("a + b = " + m);// 输出int的返回结果
instance.CPPsay(Str);// 输出字符串
System.out.println("instance.isCOM1(portName) "
+ instance.isCOM1(portName));
if (instance.isCOM1(portName)) { // 返回布尔运算
System.out.println("成功打开串口:" + portName);
} else {
System.out.println("打开串口:" + portName + " 失败");
}
}
}
package jacob;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.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("COMTest.COMTestClass"); // 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();
}
}
}