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