日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

java com dll_通过COM组件方式实现java调用C#写的DLL文件

發布時間:2024/9/19 C# 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java com dll_通过COM组件方式实现java调用C#写的DLL文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

通過Java調用C#的DLL文件實現。網上資料很多,自己整合總結了一下,做個備忘。

一、C#寫com組件

開發環境 VS2013

1、新建工程:TestDemo(類庫項目) ??? //根據自己需要取工程名

注:WIN7以上系統VS必須以管理員身份啟動!!!!!

2、右鍵點擊工程->應用程序->程序集信息->使程序集com可見,打上勾(或者:項目->TestDemo屬性->應用程序->程序集信息->使程序集com可見,打上勾)

注:1.創建工程的時候,NET Framework 版本是.NET Framework 4

2.創建的是C#標簽下的類庫項目

3、如果是64位程序,修改解決方案為x64平臺,在解決方案上右擊,否則無需修改

然后右鍵點擊工程->生成->為COM互操作注冊(C) 打上勾

3、設置強簽名(同樣要以管理員的身份運行)

打開Visual Studio Command Prompt (VS2013 開發人員命令提示)

輸入:sn -k C:/TestComkey.snk 生成TestComkey.snk 文件,注意路徑。

VS2013 開發人員命令提示工具的路徑是安裝VS2013路徑下

比如我的是?? D:\ProgramFiles\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts

在簽名 標簽中選中 為程序集簽名,選擇剛剛生成的強名稱文件TestComkey.snk 。

4、創建GUID

通過點擊工具->創建GUID->選擇4->New Guid->copy->替換:下一步(即 5、C#代碼 ) 中的兩個 GUID?值(需要點擊兩次,兩個GUID值不能相同)

5、C#代碼

C#代碼中必須定義了接口,才可以按照此方法實現調用。

usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Runtime.InteropServices;namespace TestCom //命名空間名稱,根據自己需要自定義。這里我們取名TestCom

{

[Guid("27F77668-3165-46C5-850B-FC458DE71424")] //GUID值

public interface IEncrypt //定義接口名

{

[DispId(1)]string GetEncrypt(string str, string str2); //返回的字符串值,與需要調用的類的方法名一致。

}

[Guid("33A6E58D-E1F5-4b53-B2E2-03B9F8BA2FAD"), ClassInterface(ClassInterfaceType.None)] //GUID值

public class Encrypt : IEncrypt //類名,接口名 ,必須定義接口

{publicEncrypt() { }public string GetEncrypt(string str, string str2) //定義具有兩個參數的方法,返回字符串。根據各自需要定義。

{return "測試:" + str + "|" +str2;

}

}

usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Runtime.InteropServices;namespaceKEYLib

{

[Guid("5209B6D6-BFAA-4CE0-BD50-8DE130A92BCD")] //GUID值

public interface IEncrypt //定義接口名

{

[DispId(1)]string GetEncrypt(string str,string str2); //返回的字符串值,與需要調用的類的方法名一致。

[DispId(2)]string GetEncrypt2(string str,stringstr2);

}

[Guid("C7AFE546-89DF-4D51-B777-CBAFB8D05412"), ClassInterface(ClassInterfaceType.None)] //GUID值

public class Encrypt:IEncrypt //類名,接口名 ,必須定義接口

{publicEncrypt(){}public string GetEncrypt(string str,string str2) //定義具有兩個參數的方法,返回字符串。根據各自需要定義。

{return "測試:"+str+"|"+str2;

}public string GetEncrypt2(string str, string str2) //定義具有兩個參數的方法,返回字符串。根據各自需要定義。

{return "第二個方法:" + str + "|" +str2;

}

}

}

代碼修改后,需要重新編譯、拷貝、注冊、和加入緩存

6、編譯程序,Debug目錄中會生成 TestDemo.dll 和TestDemo.tlb。

7、將TestDemo.dll 和TestDemo.tlb復制到JAVA開發環境中,并且JAVA環境中需要安裝對應版本的.net framework。

注:JAVA開發環境指JDK下的bin目錄(如:C:\Program Files\Java\jdk1.7.0_79\bin),我的是win8的系統,默認就安裝了.NET Framework 4.0

8、在JAVA開發環境中注冊新生成的com組件,在客戶環境中,通過regasm.exe注冊com組件。

regasm.exe的默認安裝路徑為:C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe

手工注冊COM方法:運行命令(管理員身份運行)

C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319>RegAsm.exe?TestDemo.DLL /tlb:TestDemo.tlb

注:如果出現:RegAsm : error RA0000 : “C:\Java\jdk1.7.0_67\bin\TestDemo.DLL”不是有效的 .NET 程序集,因此未能加載? 的提示時,就使用更高版本的regasm(C:\Windows\Microsoft.NET\Framework\v4.0.30319),我換成v4.0.30319目錄下的regasm就OK了

注:因為上面我們選擇的是X64平臺,因此需要C:\Windows\Microsoft.NET\Framework64\v4.0.30319的regasm.exe

9、強簽名的dll文件添加到緩存中。

執行命令:gacutil -i C:\Java\jdk1.7.0_67\bin\TestDemo.DLL (執行這個命令需要TestDemo.DLL 具有強名稱)

gacutil 程序在C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin目錄下

注:我用的是

C:\Program Files\Microsoft SDKs\Windows\v7.0A\bin\NETFX 4.0 Tools>gacutil -i "c:

\Program Files\Java\jdk1.7.0_79\bin\TestDemo.DLL"。

注意:因為Program Files有空格,因此輸入時最好使用tab鍵自動選擇輸入,并且會自動加上“”

10、查看注冊表regedit,HKEY_CLASSES_ROOT中是否有TestCom.Encrypt 項,如果有說明注冊COM成功。如果沒有,請重新注冊。

二、Java調用Com

1、部署jacob,下載地址:http://sourceforge.net/projects/jacob-project/

2、打開Eclipse->new->project->在頁面中選擇 Web->Dynamic Web Project 點 NEXT按鈕 在Project Name 欄中輸入項目名稱JniDemo 然后一路next就可以了

在開發環境中引入jacob.jar,放到WEB-INF\Llib目錄下(即把jacob.jar拷貝到上面新建項目的目錄下,如:D:\Eclipse\workspace\JNIDemo\WebContent\WEB-INF\lib)。

3、拷貝 jacob-1.18-x64.dll 文件到 C:\Windows\System32目錄,如果是Web應用的話還需要拷貝到jdk1.7.0_67\bin目錄(jdk安裝目錄下的bin目錄)

沒有拷貝 jacob-1.18-x64.dll 文件到 C:\Windows\System32目錄會報以下錯誤:

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class com.jacob.com.ComThread

4、java調用代碼?TestDemo.java

import com.jacob.activeX.*;import com.jacob.com.*;public classTestDemo {public static voidmain(String[] args){try{

ComThread.InitSTA();

ActiveXComponent dotnetCom=null;

dotnetCom=new ActiveXComponent("KEYLib.Encrypt");

Variant var= Dispatch.call(dotnetCom,"GetEncrypt","第一個參數","第二個參數");

String str=var.toString();

System.out.println(str);

}catch(Exception ex)

{

ex.printStackTrace();

}finally{

ComThread.Release();

}

}

}

5、運行?TestDemo.java

輸出結果為:測試:?第一個參數 | 第二個參數

完成了Java調用.net DLL的方法.

總結

以上是生活随笔為你收集整理的java com dll_通过COM组件方式实现java调用C#写的DLL文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。