一、引言
实验目的:
构建一个com组件,该组件存储了10000个12位的验证码;输入一个验证码,组件返回该验证码是否正确(是否是10000个其中之一);输入一个字符串,返回一个对应的映射的验证码(映射方法自己定义)。
二、环境
- Windows 10 ×64
- Visual Studio 2015
- IDEA 2018.1.5
- jacob-1.19
三、实验步骤
1.C#写com组件
以管理员身份运行VS
新建->项目->Visual C#->选择【类库】,名称自定义:MyComToJava,点击【确定】
![](http://upload-images.jianshu.io/upload_images/17029763-c25a50eb8daa65e9.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/938/format/webp)
重命名cs文件:MyComToJava.cs,可自定义。弹窗选择【是】
![](http://upload-images.jianshu.io/upload_images/17029763-3b7007225b037b31.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/256/format/webp)
右键点击工程->属性->应用程序->程序集信息->“使程序集COM可见(M)”打上勾,点击【确定】
![](http://upload-images.jianshu.io/upload_images/17029763-9f18b4a422a539b7.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/614/format/webp)
![](http://upload-images.jianshu.io/upload_images/17029763-5b047f2e80beb956.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/757/format/webp)
![](http://upload-images.jianshu.io/upload_images/17029763-9bf666ba9bb27a43.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/572/format/webp)
生成->“为COM互操作注册(C)”打上勾,保存
![](http://upload-images.jianshu.io/upload_images/17029763-d15952b9f343d66f.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/757/format/webp)
签名->“为程序集签名(A)”打上勾->新建签名MyComToJava->取消勾选“使用密码保护密钥文件”,点击【确定】,保存
![](http://upload-images.jianshu.io/upload_images/17029763-5b34d2c65f735611.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/790/format/webp)
通过点击工具->创建 GUID->选择5->新建 GUID->复制->替换C#代码中的两个 GUID 值
![](http://upload-images.jianshu.io/upload_images/17029763-b83158903eb44768.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/930/format/webp)
![](http://upload-images.jianshu.io/upload_images/17029763-63d6ec731c3968b2.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/368/format/webp)
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