通過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的方法!
通過COM組件方式實現java調用C#寫的DLL文件 轉