通過COM元件方式實現java呼叫C#寫的DLL檔案 轉
最近一段時間單位在做一個Web專案,工程師用JAVA語言,需要公用人員資訊,統一使用者名稱和密碼,原有的平臺中是用C#語言開發的,在網上查詢解決方法,通過JAVA呼叫C#的DLL檔案實現。網上資料很多,自己整合總結了一下,做個備忘。
一、C#寫com元件
開發環境 vs2005
1、新建工程:ClassLibrary1 //根據自己需要取工程名
2、右鍵點選工程->應用程式->程式集資訊->使程式集com可見,打上勾
右鍵點選工程->生成->為com Interop註冊 打上勾
3、設定強簽名
開啟Visual Studio Command Prompt 輸入:sn -k TestComkey.snk 生成TestComkey.snk 檔案,注意路徑。
在簽名 標籤中選中 為程式集簽名,選擇剛剛生成的強名稱檔案TestComkey.snk 。
4、GuidAttribute中的Guid
通過點選工具->建立GUID->選擇4->New Guid->copy->替換C# 程式碼4 中的兩個 GUID 值
5、C#程式碼
C#程式碼中必須定義了介面,才可以按照此方法實現呼叫。
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace TestCom //名稱空間名稱,根據自己需要自定義。這裡我們取名TestCom { [Guid("E9BCF867-CD81-40d0-9591-ED28D1ED2B53")] //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 //類名,介面名 ,必須定義介面 { public Encrypt(){} public string GetEncrypt(string str,string str2) //定義具有兩個引數的方法,返回字串。根據各自需要定義。 { return "測試: "+str+" | "+str2; } } }
6、編譯程式,Debug目錄中會生成 ClassLibrary1.dll 和ClassLibrary1.tlb。
7、將ClassLibrary1.dll 和ClassLibrary1.tlb複製到JAVA開發環境中,JAVA環境中需要安裝對應版本的.net framework。
8、在JAVA開發環境中註冊新生成的com元件,在客戶環境中,通過regasm.exe註冊com元件。
regasm.exe的預設安裝路徑為:C:\Windows\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe
手工註冊COM方法:執行命令regasm ClassLibrary1.DLL /tlb:ClassLibrary1.tlb
9、強簽名的dll檔案新增到快取中。
執行命令:gacutil -i ClassLibrary1.DLL (執行這個命令需要TestCom.DLL 具有強名稱)
gacutil 程式在VS目錄 Microsoft Visual Studio 8\SDK\v2.0\Bin 目錄下,複製到JAVA環境中。
10、檢視登錄檔regedit,HKEY_CLASSES_ROOT中是否有TestCom.Encrypt 項,如果有說明註冊COM成功。如果沒有,請重新註冊。
二、Java呼叫Com
1、部署jacob,下載地址:http://sourceforge.net/projects/jacob-project/
2、在開發環境中引入jacob.jar,放到WEB-INF\Llib目錄下。
3、拷貝jacob-1.15-M4-x86.dll 檔案到 C:\Windows\System32目錄,如果是Web應用的話還需要拷貝到jdk1.5.0_16\bin目錄(jdk安裝目錄下的bin目錄)
4、java呼叫程式碼 test.java
import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class test { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try{ ActiveXComponent dotnetCom = null; dotnetCom = new ActiveXComponent("TestCom.Encrypt"); //需要呼叫的C#程式碼中的名稱空間名和類名。 Variant var = Dispatch.call(dotnetCom,"GetEncrypt","第一個引數","第二個引數"); //需要呼叫的方法名和引數值 String str = var.toString(); //返回需要的字串 System.out.println(str); //輸出得到的字串。檢查結果是否正確。 } catch (Exception ex) { ex.printStackTrace(); } } }
5、執行 test.java
輸出結果為:測試: 第一個引數 | 第二個引數
完成了Java呼叫.net DLL的方法!