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文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何选购吊篮椅
- 下一篇: 《梦想帝王》智将应用攻略