




免费预览已结束,剩余3页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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.csnamespace 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; 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、 编译程序,binDebug目录中会生成 COMTest.dll 和COMTest.tlb文件。第二步:利用C+进行再封装1、 创建C+ DLL项目,新建项目-VC+-Win32 项目(名称:COMTest_Bridge)-下一步-应用程序类型:DLL2、 添加类,类名: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 #include #include COMTest_Bridge.h#import .DebugCOMTest.tlbusing 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+ DLL1、 创建java项目,添加C+ DLL到项目下;2、 添加 jna.jar包到 jdk1.6jrelibext下3、 创建接口: ICOMTest_Bridge(名字和C+ DLL 名字一致);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);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;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 + 失败);第二种 java 通过Jacob调用同第一种,需安装Visual Studio 2010 ,下载jacob.jar和jacob-1.16-M1-x86.dll()第一步:利用C#写COM组件(完全同第一种方法的第一步,此处省略)第二步:java调用C+ DLL1、 在开发环境中引入jacob.jar(解压放置于jdk_home/jre/lib/ext目录下);2、 拷贝jacob-1.16-M1-x86.dll文件到 C:WindowsSystem32目录,如果是Web应用的话还需要拷贝到jdk1. 6bin目录(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 stubint 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(); / 返回值Sys
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高二物理下学期第一次月考试题
- PEP三年级英语unit2同步练习汇编
- 自动化学发光仪操作流程
- 物业维保服务质量管理标准
- 建筑工程项目管理制度及流程手册
- IT服务外包合同风险管控要点
- 注册会计师公司战略与风险管理笔记
- 企业员工绩效考核方案设计与执行
- 医院感染控制操作流程及考核试卷
- 企业成本控制与预算管理分析报告
- 第一单元《精神信仰力量情感》《大路歌》教学设计湘艺版初中音乐八年级上册
- 动火作业现场安全防护设施布置与维护更新方案
- 核心素养导向课堂教学反思
- 《机器学习》课件-第3章 监督学习
- 山东省济南市2025届中考数学真题(含答案)
- 医疗机构医疗质量安全专项整治行动方案
- 基于SprintBoot的大学生实习管理系统的设计与实现
- 外踝撕脱骨折课件
- 钢架油漆翻新施工方案(3篇)
- 数字平台治理 课件 第五章 数字平台生态治理
- 2024-2025学年河南省省直辖县级行政单位人教PEP版(2024)三年级下册6月期末测试英语试卷(含答案)
评论
0/150
提交评论