1. 程式人生 > >通過COM元件方式實現java呼叫C#寫的DLL檔案 轉

通過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的方法!