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.获取字符串对应的映射的验证码”时,输入字符串,显示该字符串对应的映射的验证码

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,290评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,399评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,021评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,034评论 0 207
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,412评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,651评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,902评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,605评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,339评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,586评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,076评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,400评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,060评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,851评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,685评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,595评论 2 270

推荐阅读更多精彩内容