版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java调用C# DLL的方法简介关于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
2、.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) i
3、f (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下编译的CO
4、M组件必须为程序进行签名,即强命名密钥;)打开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、 编译程序,binDe
5、bug目录中会生成 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
6、 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 boo
7、l 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 "
8、.DebugCOMTest.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=CoInitiali
9、ze(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+无法
10、调用托管的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);bo
11、olean 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 = (
12、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 (insta
13、nce.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.
14、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;publ
15、ic 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(); / 返回值System.out.println("
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Noscapine-Standard-生命科学试剂-MCE
- N-N-Dimethylacetamide-Standard-生命科学试剂-MCE
- 面具的课程设计
- 趣味课程课程设计
- 牵引传动与制动课程设计
- 园林苗木移植方案
- XX公司防盗应急预案
- 工程测量放线施工方案
- 湖州师范学院《形式与政策1》2021-2022学年第一学期期末试卷
- 接触网课程设计设计目标
- 培优提高训练华师大版九年级数学上册一元二次方程 典型例题解析学生用
- 腺相关病毒操作手册
- 英语语音教程ppt课件
- GS069电动工具直流调速电路
- 二十五项反措(汽机专业)
- (交通运输)智慧城市系列之智能交通系统(完整版)
- 全国教师信息管理系统信息变更修改操作方法
- 理想别墅的数学_Colin R Microsoft W
- 附件2:跨境业务人民币结算收款说明
- 污水处理厂350KW分布式光伏发电项目初步设计方案
- 民航货物运输PPT课件
评论
0/150
提交评论