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

java调用C#封装的dll方法

第二步:利用 C++进行再封装
1、 创建 C++ DLL 项目,新建项目->VC++->Win32 项目(名称:COMTest_Bridge)->下一步->应用程 序类型:DLL
2、 添加类,类名:COMTest_Bridge,.h 名:COMTest_Bridge.h,.cpp 名:COMTest_Bridge.cpp, 然后生成项目;
COMTestClass.cs
namespace COMTest {
public interface COMTestIfce {
int add(int a, int b); void say( string str); bool isCOM1(string portName); };
public class COMTestClass : COMTestIfce {
COMTest命名空间,COMTestCLass类名 Variant var = Dispatch.call(dotnetCom, "add", a, b); Dispatch.call(dotnetCom, "say", info);//调用say方法 String str = var.toString(); // 返回值 System.out.println("str: " + str);
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")) {
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 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 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"); //
第一种 java 利用 JNA 调用 C# DLL
需安装 Visual Studio 2010 ,下载 jna.jar(解压放置于 jdk_home/jre/lib/ext 目录下)。
第一步:利用 C#写 COM 组件
1、 新建一个类库项目(文件—新建—项目—类库;命名:COMTest);//根据实际需要取文件名 2、 生成.cs 主文件 ;
贝到 jdk1. 6\bin 目录(jdk 安装目录下的 bin 目录) 3、 Jacob.jar 和 jacob.dll 放到项目的 lib 下 4、 Jacob.dll 放到 jdk1.6.0_14\jre\bin 和 jre(jdk 外的)bin 里面 5、 注册 C# 生成的 COM 组件(COMTest.dll 、COMTest.tlb):注册方法同上第二部分的 6、 Java 调用 C# dll 类实现:
} catch (Exception ex) { ex.printStackTrace();
} } }
7、 注意事项: 1)、dotnetCom = new ActiveXComponent("TestClass");注意正确映 射 GUID,否则报错找不到映射类,解决方式:在注册表中查看相应类名 例如:运行->regedit-> HKEY_CLASSES_ROOT-> TestClass
// 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){
3、 把第一步生成的 COMTest.dll 和 COMTest.tlb 文件放入 C++项目下的 Debug 文件夹下。 4、 注册 COM 组件:
4.1 打开 Visual Studio Command Prompt 进入 Debug 目录,运行命令注册: gacutil -i .dll 全文件名;regasm .dll 全文件名;
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; }
E:\C#\COMTest\COMTest\bin\Debug E:\C#\COMTest\COMTest\bin\Debug
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)、注意按顺序引用头文件,否则无法编译
} }
第二种
java 通过 Jacob 调用
同第一种,需安装 Visual Studio 2010 ,下载 jacob.jar 和 jacob-1 组件
(完全同第一种方法的第一步,此处省略)
第二步:java 调用 C++ DLL
1、 在开发环境中引入 jacob.jar (解压放置于 jdk_home/jre/lib/ext 目录下); 2、 拷贝 jacob-1.16-M1-x86.dll 文件到 C:\Windows\System32 目录,如果是 Web 应用的话还需要拷
Java 调用 C# DLL 的方法简介
By 潘伟 2012-8-7
关于 java 调用 C# 封装的 DLL 文件的方法 第一种:java 利用 JNA 进行调用 思路:C#源码生成 COM 组件(dll 和 tlb 文件),再利用 C++进行封装,java 通过 JNA 调用 C++封装 的 DLL。 第二种:java 利用 jacob 进行调用
相关主题