COM組件和調用詳細教程


一、引言


實驗目的:

構建一個com組件,該組件存儲了10000個12位的驗證碼;輸入一個驗證碼,組件返回該驗證碼是否正確(是否是10000個其中之一);輸入一個字符串,返回一個對應的映射的驗證碼(映射方法自己定義)。

二、環境

  • Windows 10 ×64
  • Visual Studio 2015
  • IDEA 2018.1.5
  • jacob-1.19

三、實驗步驟


1.C#寫com組件

以管理員身份運行VS
新建->項目->Visual C#->選擇【類庫】,名稱自定義:MyComToJava,點擊【確定】

 
 

重命名cs文件:MyComToJava.cs,可自定義。彈窗選擇【是】

 
 

右鍵點擊工程->屬性->應用程序->程序集信息->“使程序集COM可見(M)”打上勾,點擊【確定】

 
 
 
 
 
 

生成->“為COM互操作注冊(C)”打上勾,保存

 
 

簽名->“為程序集簽名(A)”打上勾->新建簽名MyComToJava->取消勾選“使用密碼保護密鑰文件”,點擊【確定】,保存

 
 

通過點擊工具->創建 GUID->選擇5->新建 GUID->復制->替換C#代碼中的兩個 GUID 值

 
 
 
 

C#代碼:C#代碼中必須定義了接口,才可以按照此方法實現調用。一定要寫ProgId。

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace MyComToJava { [Guid("E2032C8D-2E32-4415-8E8C-CFACBCAAADF3")] public interface IVerifyCode { string CheckVerifyCode(string str); string StrToVerifyCode(string str); string GetVerifyCode(int i); } [Guid("BF4EFCF8-8F67-46F2-A84F-E88C8C3DD7A7"),ClassInterface(ClassInterfaceType.None)] [ProgId("MyComToJava.Application")] public class VerifyCode : IVerifyCode { int number = 10; int length = 12; List<string> list; public VerifyCode() { list = new List<string>(); CreateVerifyCode(number,length); } //生成10000個12位的驗證碼 public List<string> CreateVerifyCode(int number,int length) { while (list.Count < number) { String code = getRandom(length); if (!list.Contains(code)) { list.Add(code); } } return list; } private static string getRandom(int length) { Random rand = new Random(); string validateStr = ""; char[] validateChar = new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8','9','a','b','c', 'd','e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' }; for (int i=0;i < length; i++) { int num = rand.Next(0, 36); validateStr += validateChar[num].ToString(); //validateStr += rand.Next(0, 9).ToString(); } return validateStr; } public string CheckVerifyCode(string str) { if (list.Contains(str)) { return "驗證碼正確"; } else { return "驗證碼錯誤"; } } public string StrToVerifyCode(string str) { string validateStr = ""; if (str.Length < length) { validateStr = str; for(int i=0;i<length - str.Length; i++) { validateStr += '0'.ToString(); } } else { for(int i = 0; i < length; i++) { validateStr += str[i].ToString(); } } return validateStr; } public string GetVerifyCode(int i) { return list[i]; } } } 

編譯生成解決方案,Debug目錄中會生成MyComToJava.dll文件
注:生成時平台必須使用x64,不然java會編譯錯誤。

 
 
 
 

注冊COM組件至系統:
開始菜單->打開VS 2015自帶CMD命令窗口(管理員權限)->定位至MyComToJava.dll文件夾下 。
執行:gacutil /i MyComToJava.dll 添加dll至全局緩存 ;
執行:regasm MyComToJava.dll 注冊dll至系統 。

 
 

查看注冊表regedit,HKEY_CLASSES_ROOT中是否有MyComToJava.VerifyCode項。如果有,則說明注冊COM成功;如果沒有,請重新注冊

 
 
 
 
2.Java調用com

IDEA新建Java項目:VerifyCodeComToJava
右鍵項目->點擊“Open Module Settings”->選擇【Modules】->在右側的Dependencies中點擊“+”,選擇“JARs OR directories...”->選擇jacob.jar所在文件夾,點擊【OK】

 
 

編輯類VerifyCode,代碼如下:

package com.verifycodecomtojava; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; import java.util.Scanner; public class VerifyCode { public static void main(String[] args) { // TODO Auto-generated method stub try{ ActiveXComponent dotnetCom = null; //需要調用的C#代碼中的命名空間名和類名 dotnetCom = new ActiveXComponent("MyComToJava.Application"); System.out.println("連接成功"); int choose; Scanner input = new Scanner(System.in); System.out.println("1.判斷驗證碼是否正確"); System.out.println("2.獲取字符串對應的映射的驗證碼"); while(true) { System.out.println("請選擇要進行的操作:"); choose = input.nextInt(); if(choose == 1){ // Variant var0 = Dispatch.call(dotnetCom, "GetVerifyCode", 0); // String str0 = var0.toString(); // System.out.println("組件中的第一位驗證碼:"+str0); System.out.println("請輸入12位驗證碼:"); String code = input.next(); //需要調用的方法名和參數值 Variant var = Dispatch.call(dotnetCom, "CheckVerifyCode", code); //返回需要的字符串 String str = var.toString(); System.out.println(str); } else if(choose ==2){ System.out.println("請輸入字符串:"); String str = input.next(); //需要調用的方法名和參數值 Variant var = Dispatch.call(dotnetCom, "StrToVerifyCode", str); //返回需要的字符串 String str2 = var.toString(); System.out.println(str2); } else{ System.out.println("無效操作!"); } } } catch (Exception ex) { ex.printStackTrace(); } } } 

最后,運行VerifyCode.java。

四、實驗結果


1.選擇操作“1.判斷驗證碼是否正確”時,輸入驗證碼

 
 

2.選擇操作“2.獲取字符串對應的映射的驗證碼”時,輸入字符串,顯示該字符串對應的映射的驗證碼

 


作者:Txue
鏈接:https://www.jianshu.com/p/be7f61ba7c86
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM