java调用C#封装的dll方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
3、 把第一步生成的 COMTest.dll 和 COMTest.tlb 文件放入 C++项目下的 Debug 文件夹下。 4、 注册 COM 组件:
4.1 打开 Visual Studio Command Prompt 进入 Debug 目录,运行命令注册: gacutil -i .dll 全文件名;regasm .dll 全文件名;
Console.WriteLine("1true"); return true; } else { Console.WriteLine("2false"); return false; } } } }
3、 右键点击工程->应用程序->程序集信息->使程序集 com 可见,打上勾
4、 右键点击工程->生成->为 com Interop 注册 打上勾
注意:项目启用 公共语言运行时支持(/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 名字一致);
} }
第二种
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 应用的话还需要拷
第二步:利用 C++进行再封装
1、 创建 C++ DLL 项目,新建项目->VC++->Win32 项目(名称:COMTest_Bridge)->下一步->应用程 序类型:DLL
2、 添加类,类名:COMTest_Bridge,.h 名:COMTest_Bridge.h,.cpp 名:COMTest_Bridge.cpp, 然后生成项目;
贝到 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 类实现:
第一种 java 利用 JNA 调用 C# DLL
需安装 Visual Studio 2010 ,下载 jna.jar(解压放置于 jdk_home/jre/lib/ext 目录下)。
第一步:利用 C#写 COM 组件
1、 新建一个类库项目(文件—新建—项目—类库;命名:COMTest);//根据实际需要取文件名 2、 生成.cs 主文件 ;
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)、注意按顺序引用头文件,否则无法编译
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 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"); //
4、 创建类:COMTest_Start:
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";
5、 设置强签名 (由于.Net 下编译的 COM 组件并等同于 C 编译的 COM 组件,所以存在必须在运行目标机器注册的情 况,对此.Net 下编译的 COM 组件必须为程序进行签名,即强命名密钥;) 打开 Visual Studio Command Prompt 输入:sn -k MyKeyFire.snk 生成 MyKeyFire.snk 文件,注意 路径。(.snk 文件可以随意取,但.snk 后缀名别忘记了) 在签名 标签中选中 为程序集签名,选择刚刚生成的强名称文件 MyKeyFire.snk 。
COMTestClass.cs
namespace COMTest {
public interface COMTestIfce {
int add(int a, int b); void say( string str); bool isCOM1(sபைடு நூலகம்ring portName); };
public class COMTestClass : COMTestIfce {
6、 在“解决方案资源管理器”中找到节点“Properties”打开 AssemblyInfo.cs 文件 如下图
7、 将[assembly: ComVisible(false)]属性改成[assembly: ComVisible(true)] 如下图
8、 编译程序,\bin\Debug 目录中会生成 COMTest.dll 和 COMTest.tlb 文件。
// 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){
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 + " 失败"); }
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; }
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);
Java 调用 C# DLL 的方法简介
By 潘伟 2012-8-7
关于 java 调用 C# 封装的 DLL 文件的方法 第一种:java 利用 JNA 进行调用 思路:C#源码生成 COM 组件(dll 和 tlb 文件),再利用 C++进行封装,java 通过 JNA 调用 C++封装 的 DLL。 第二种:java 利用 jacob 进行调用
} catch (Exception ex) { ex.printStackTrace();
} } }
7、 注意事项: 1)、dotnetCom = new ActiveXComponent("COMTest.COMTestClass");注意正确映 射 GUID,否则报错找不到映射类,解决方式:在注册表中查看相应类名 例如:运行->regedit-> HKEY_CLASSES_ROOT-> COMTest.COMTestClass
相关文档
最新文档