本节说明Java通过Com组件连接.Net(调用dll)实现方法及主要代码,如下:
1. VS2008新建-项目-C#-类库,取名,如:J2NByDllClassLibrary;
2. 添加-新建项-类:MyJ2N,编写代码(示例如下):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace J2NByDllClassLibrary
{
[Guid("3DB8FA5A-50FE-415d-B4D1-74EF249D46A2")]
public interface IMyJ2N
{
[DispId(1)]
string GetEncrypt(string str, string str2);
}
[Guid("7BE525EE-46AE-4cc5-B21A-F4BF558AD79E"), ClassInterface(ClassInterfaceType.None)]
public class MyJ2N : IMyJ2N
{
public MyJ2N() { }
public string GetEncrypt(string str, string str2) //此处的两个参数没用到,只是示例
可以传参
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 5; i++)
{
sb.Append(i + ",");
sb.Append("aa" + i + ",");
sb.Append("bb" + i + ",");
}
//sb.Remove(sb.Length - 2, 1);
//System.Console.WriteLine(sb.ToString());
return sb.ToString();
}
}
}
3. GUID生成:
打开Visual Studio命令提示,输入guidgen 命令调出工具。类型选择Registry Format,点击两次New
Guid,生成两个GUID,并分别COPY出来替换上面示例代码的interface和class类名处的GUID。
4. 设置强名称:
打开Visual Studio命令提示,输入:sn -k TestComkey.snk 生成TestComkey.snk 文件(生成文件的路
径可自己确定,我选择在项目所在文件夹的bin/debug/下,即转到该文件夹路径再执行SN命令)。
5. 右击程序名打开property窗口:
在应用程序标签中打开 “程序集信息” 将“使程序集COM可见”一项选中。再切换到生成标签将 “为
COM互操作注册”一项选中。在签名标签中选中“为程序集签名”,浏览选择刚刚生成的强名称文件
TestComkey.snk。
6. 生成:确认以上操作执行完并保存后,右击程序名选生成菜单,生成程序集。
7. 注册COM:
打开Visual Studio命令提示并进入程序的Debug目录,运行命令注册并放入缓存:
regasm J2NByDllClassLibrary.DLL /tlb:J2NByDllClassLibrary.tlb
gacutil -i J2NByDllClassLibrary.DLL
8. java调用COM:
需引入jacob.jar包。
示例代码:
public static void main(String[] args) {
ActiveXComponent com = new ActiveXComponent("J2NByDllClassLibrary.MyJ2N");
//namespace.class
Variant var = Dispatch.call(com, "GetEncrypt", "第一个参数", "第二个参数");
//COM,方法名,参数
String retVal = var.getString();
String[] array = retVal.split(",");
List<User> users = new java.util.ArrayList<User>();
for (int i = 0; i < array.length; i+=3) {
if(array[i].length() > 0){
User user = new User();
user.setUserId(Integer.parseInt(array[i]));
user.setUserName(array[i + 1]);
user.setPassword(array[i + 2]);
users.add(user);
}
}
System.out.println(users.size());
}