1. 程式人生 > >通過COM組件方式實現java調用C#寫的DLL文件 轉

通過COM組件方式實現java調用C#寫的DLL文件 轉

time rar .exe 字符串 sys 還需 第一個 運行 system

最近一段時間單位在做一個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的方法!

通過COM組件方式實現java調用C#寫的DLL文件 轉