程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java 調用.net DLL的方法

java 調用.net DLL的方法

編輯:關於JAVA

 背景:近日一個Java(Java教程 Java培訓 )的項目,客戶要求項目中必須使用其提供的加密機制,扔給了兩個.Net寫的DLL。網絡上搜了一圈也沒找到啥東西,甚至看到人揚言此事絕無可能。郁悶當中考慮了一個思路。用C#(C#培訓 )做一個Com,調用客戶提供的DLL實現加密解密的方法,然後提供給Java使用。經過一番搗騰,最後證實可行。

  環境與工具:

  1、.Net framework 3.5 C#

  2、Java jdk1.5, Tomcat 5.5

  3、jacob-1.15-M3

  實現例子:

  一、C# 制作Com組件

  新建一個Class 項目,取名TestComusing System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  using System.Runtime.InteropServices;

  namespace TestCom

  {

  [Guid("E9BCF867-CD81-40d0-9591-ED28D1ED2B53")]

  public interface IEncrypt

  {

  [DispId(1)]

  string GetEncrypt(string str,string str2);

  }

  [Guid("33A6E58D-E1F5-4b53-B2E2-03B9F8BA2FAD"), ClassInterface(ClassInterfaceType.None)]

  public class Encrypt:IEncrypt

  {

  public Encrypt(){}

  public string GetEncrypt(string str,string str2)

  {

  return "測試 | "+str+"|"+str2;

  }

  }

  }

  打開 Project--> PropertIEs菜單 在Application標簽中打開 Assembly Information 將Make assembly Com-Visible一項選中。再切換到Build標簽將 Register for COM interop一項選中。

  Guid的生成:打開Visual Studio Command Prompt 輸入guidgen 命令調出工具。類型選擇Registry Format,點擊New Guid,然後COPY出來。

  [DispId(1)]為函數的標識。如果有多個函數可相應的在函數前面加[DispId(2)], [DispId(3)]…

  設置強名稱:打開Visual Studio Command Prompt 輸入:sn -k TestComkey.snk 生成TestComkey.snk 文件

  打開 Project--> PropertIEs菜單 在Signing標簽中選中 Sign the assembly,選擇剛剛生成的強名稱文件TestComkey.snk

  編譯程序Debug目錄中會生成 TestCom.dll 和TestCom.tlb

  手工注冊Com方法:

  打開Visual Studio Command Prompt進入Debug目錄,運行命令注冊:

  regasm TestCom.DLL /tlb:TestCom.tlb

  gacutil -i TestCom.DLL (執行這個命令需要TestCom.DLL 具有強名稱)

  二、Java 調用 Com

  部署jacob

  1、在開發環境中引入jacob.jar

  2、拷貝jacob-1.15-M3-x86.dll 文件到 C:\Windows\System32目錄,如果是Web應用的話還需要拷貝到jdk1.5.0_16\bin目錄(jdk安裝目錄下的bin目錄)。

  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");

  Variant var = Dispatch.call(dotnetCom,"GetEncrypt","哥是第一個參數","哥是第二個參數");

  String str = var.toString(); //返回值

  } catch (Exception ex) {

  ex.printStackTrace();

  }

  }

  }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved