java調(diào)用C#封裝的dll方法_第1頁
java調(diào)用C#封裝的dll方法_第2頁
java調(diào)用C#封裝的dll方法_第3頁
java調(diào)用C#封裝的dll方法_第4頁
java調(diào)用C#封裝的dll方法_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Java調(diào)用C# DLL的方法簡(jiǎn)介關(guān)于java調(diào)用C# 封裝的DLL文件的方法第一種:java利用JNA進(jìn)行調(diào)用思路:C#源碼生成COM組件(dll和tlb文件),再利用C+進(jìn)行封裝,java通過JNA調(diào)用C+封裝的DLL。第二種:java利用jacob進(jìn)行調(diào)用第一種 java利用 JNA調(diào)用C# DLL需安裝Visual Studio 2010 ,下載jna.jar(解壓放置于jdk_home/jre/lib/ext目錄下)。第一步:利用C#寫COM組件1、 新建一個(gè)類庫(kù)項(xiàng)目(文件新建項(xiàng)目類庫(kù);命名:COMTest);/根據(jù)實(shí)際需要取文件名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、 右鍵點(diǎn)擊工程->應(yīng)用程序->程序集信息->使程序集com可見,打上勾4、 右鍵點(diǎn)擊工程->生成->為com Interop注冊(cè) 打上勾5、 設(shè)置強(qiáng)簽名(由于.Net下編譯的COM組件并等同于C編譯的COM組件,所以存在必須在運(yùn)行目標(biāo)機(jī)器注冊(cè)的情況,對(duì)此.Net下編譯的CO

4、M組件必須為程序進(jìn)行簽名,即強(qiáng)命名密鑰;)打開Visual Studio Command Prompt 輸入:sn -k MyKeyFire.snk 生成MyKeyFire.snk 文件,注意路徑。(.snk文件可以隨意取,但.snk后綴名別忘記了)在簽名 標(biāo)簽中選中 為程序集簽名,選擇剛剛生成的強(qiáng)名稱文件MyKeyFire.snk 。6、 在“解決方案資源管理器”中找到節(jié)點(diǎn)“Properties”打開AssemblyInfo.cs文件如下圖7、 將assembly: ComVisible(false)屬性改成assembly: ComVisible(true)如下圖8、 編譯程序,binDe

5、bug目錄中會(huì)生成 COMTest.dll 和COMTest.tlb文件。第二步:利用C+進(jìn)行再封裝1、 創(chuàng)建C+ DLL項(xiàng)目,新建項(xiàng)目->VC+->Win32 項(xiàng)目(名稱:COMTest_Bridge)->下一步->應(yīng)用程序類型:DLL2、 添加類,類名:COMTest_Bridge,.h名:COMTest_Bridge.h,.cpp名:COMTest_Bridge.cpp,然后生成項(xiàng)目;3、 把第一步生成的COMTest.dll 和COMTest.tlb文件放入C+項(xiàng)目下的Debug文件夾下。4、 注冊(cè)COM組件:4.1打開Visual Studio Command

6、 Prompt進(jìn)入Debug目錄,運(yùn)行命令注冊(cè):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)、基本類型轉(zhuǎn)換對(duì)應(yīng)時(shí)。C#和java 中的String對(duì)應(yīng)于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;注意:項(xiàng)目啟用 公共語言運(yùn)行時(shí)支持(/clr),否則C+無法

10、調(diào)用托管的C# dll。如圖:6、 重新生成項(xiàng)目。得到COMTest_Bridge.dll文件第三步 java調(diào)用C+ DLL1、 創(chuàng)建java項(xiàng)目,添加C+ DLL到項(xiàng)目下;2、 添加 jna.jar包到 jdk1.6jrelibext下3、 創(chuàng)建接口: 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、 創(chuàng)建類:COMTest_Start:package jna;import com.sun.jna.Native;public class COMTest_Start static int a = 5;static int b = 4;static String Str = "轉(zhuǎn)告波仔:打印中文字符!"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的返回結(jié)果instance.CPPsay(Str);/ 輸出字符串System.out.println("instance.isCOM1(portName) "+ instance.isCOM1(portName);if (insta

13、nce.isCOM1(portName) / 返回布爾運(yùn)算System.out.println("成功打開串口:" + portName); else System.out.println("打開串口:" + portName + " 失敗");第二種 java 通過Jacob調(diào)用同第一種,需安裝Visual Studio 2010 ,下載jacob.jar和jacob-1.16-M1-x86.dll()第一步:利用C#寫COM組件(完全同第一種方法的第一步,此處省略)第二步:java調(diào)用C+ DLL1、 在開發(fā)環(huán)境中引入jacob.

14、jar (解壓放置于jdk_home/jre/lib/ext目錄下);2、 拷貝jacob-1.16-M1-x86.dll文件到 C:WindowsSystem32目錄,如果是Web應(yīng)用的話還需要拷貝到j(luò)dk1. 6bin目錄(jdk安裝目錄下的bin目錄)3、 注冊(cè)C# 生成的COM組件(COMTest.dll 、COMTest.tlb):注冊(cè)方法同上第二部分的4、 Java調(diào)用C# dll類實(shí)現(xiàn):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);/調(diào)用say方法String str = var.toString(); / 返回值System.out.println("

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論