일부 작업은 통합해야하기 때문에 최근에 작업 요구 사항, 엔지니어는 클라이언트 측 자바 언어 발달 프로그램을 사용하고 있기 때문에, 우리 측 플랫폼은 C # 언어로 개발, 그래서 온라인으로 해결책을 찾아, 그는 연습 여기의 메모를 확인, 공유 할 수 있습니다.
면책 조항 : 다음 작업이 나는 새로운 운영 데모 나는이 기사를 쓰기 위해 두 부분으로, C #을 COM으로 작성된 첫 번째 부분으로 나누어 져 있습니다,
직장에서 데모가 일부 촬영 시간을 절약하기 위해, 그것으로 나올 데리러가, 고객에게 지침을 작성 여기에 있었기 때문에 두 번째 부분은 예를 들면, 나는 다시 작동하지 않습니다,,, C #을 자바 호출 COM 구성 요소 작성 메시지가 이해되지 않을 수도 있습니다.
C # COM 구성 요소를 작성 하나,
개발 환경 : VS2017
1, 신축 : .NET 프레임 워크 4, 당신은 자신에 따라 선택할 수 있습니다 CalcTest (클래스 라이브러리 프로젝트, 자신의 취향에 따라 내가 여기에 사용되는 프레임 워크, 프로젝트 이름을해야합니다. (참고 : 빨간색 상자와 화살표 및주의 사항 다음)
아래 그림과 같이 2, 오른쪽 프로젝트 속성은, 체크 표시, 다음과 같은 화면을 볼 수, 프로젝트 속성을 클릭 어셈블리 정보를 볼 조립 COM "빨간색 상자를 클릭
총회는 개인적인 선호에 따라 추가 정보를 기록 할 수 쓸 수 없습니다.
X64 : 3, 선택한 다음 화면 선택을 생성하기 위해 타겟 플랫폼 참조 아래와 같이 COM 상호 운용성 (C) 후크 동작에 등록된다.
4. 다음 관리자 권한으로 실행하는 강력한 서명을 설정하는 것입니다
①. 비주얼 스튜디오 명령 프롬프트 (VS2017 개발자 명령 프롬프트를) 찾기
다음 명령을 입력 : SN -k D를 : /CalcComkey.snk를
这里我生成的CalcComkey.snk 文件放在D盘,注意选择你自己的保存路径。
VS2017 开发人员命令提示工具的路径是安装VS2017 路径下,你可以自己找一下,每个人安装位置不一样。
比如我的是 : C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2017\Visual Studio Tools
5、在签名 标签中选中 为程序集签名,选择刚刚生成的强名称文件CalcComkey.snk 。
6、创建GUID
通过点击工具 => 创建GUID => 选择4 => New Guid => copy => 替换下面 C#代码中的两个 GUID 值
创建GUID,新建复制,粘贴到代码中去就可以,把代码中那两个都替换掉。
using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; namespace CalcTest { [Guid("68E2A6FD-F437-4107-A6DB-E78714EC8D8B")] //GUID值 interface ICalc { [DispId(1)] int Add(int a, int b); //返回的int值,与需要调用的类的方法名一致。 } [Guid("60D60EE5-EAF3-482C-BE33-DED6BE635111"), ClassInterface(ClassInterfaceType.None)] //GUID值 public class Calc : ICalc //类名,接口名 ,必须定义接口 { public Calc() { } //定义具有两个参数的方法,返回计算结果。根据各自需要定义。 public int Add(int a, int b) { return a+b; } } }
7、编译生成程序,Debug目录中会生成 CalcTest.dll 和CalcTest.tlb。
二、java调用C#编写com组件
一、准备工作
1、刚刚上文中我们生成的两个文件,CalcTest.dll 、 CalcTest.tlb,先保存起来,一会儿会用到。
命名空间为:CalcTest、类名为:Calc
2、jacob下载,可以自主下载,这里提供一个,下面是百度网盘的地址和提取码:
链接:https://pan.baidu.com/s/1U_2NDpQvmScSB9_fICW9Ig
提取码:s60u
二、实现步骤
1、将CalcTest.dll、CalcTest.tlb复制到JAVA开发环境中,JAVA环境中需要安装对应版本的.net framework
注:JAVA开发环境指JDK下的bin目录,我的是win7的系统,默认就安装了.NET Framework 4.0
2、在JAVA开发环境中注册新生成的com组件,在客户环境中,通过regasm.exe注册com组件。
Regasm.exe默认安装路径为:C:\Windows\Microsoft.NET\Framework\v2.0.50727
注:因为上面我们选择的是X64平台,因此框架是选择Framework64,路径为:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
还有步骤1的意思就是,把CalcTest.dll、CalcTest.tlb复制到这个路径下面C:\Windows\Microsoft.NET\Framework64\v4.0.30319
注:图片中的InvokeTest.dll和Invoke.tlb就是我们上文的CalcTest.dll、CalcTest.tlb
①、按下win+R,输入cmd进入控制面板
②、输入 cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319
③、接下来,手动注册COM方法:运行命令(管理员身份运行)
④、regasm CalcTest.DLL /CalcTest.tlb
出现以下界面说明注册成功:
注:图片中的InvokeTest.dll和Invoke.tlb就是我们上文的CalcTest.dll、CalcTest.tlb
3、强签名的dll文件添加到缓存中
1、首先找到gacutil,路径为:C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools
注:也有可能在这里路径下面找不到gacutil,那么就去下载一个或者找一下其他地方的复制过来,我一开始就没有这个bin文件夹,从其他地方拷贝过来的。
注:图片中的InvokeTest.dll和Invoke.tlb就是我们上文的CalcTest.dll、CalcTest.tlb
2、接下来就是要将dll添加到缓存中
①、按下win+R,输入cmd进入控制面板
②、输入
cd C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools
③、执行命令: 执行这个命令需要InvokeTest.DLL 具有强名称
gacutil -i C:\Program Files\Java\jdk1.8.0_181\bin\InvokeTest.DLL
注:上面这个路径因人而异,找到你自己jdk的存放路径,把InvokeTest.dll、InvokeTest.tlb放到bin文件夹下面。
注:图片中的InvokeTest.dll和Invoke.tlb就是我们上文的CalcTest.dll、CalcTest.tlb
Ok,dll添加到缓存中的操作就完成了,看到以下界面就说明成功添加了
或者
4、查看注册表regedit,HKEY_CLASSES_ROOT中是否有InvokeTest.MyMd5 项,如果有说明注册COM成功。如果没有,请重新注册。重复上面过程。
查看注册表,不知道怎么操作的,下面链接可以打开看,或者自己上网查。
https://jingyan.baidu.com/article/295430f10e5cc80c7e00500d.html
看到以下界面说明注册成功了
注:图片中的InvokeTest.MyMd5就是我们上文的CalcTest.Calc,因为节省时间,我上文给大家演示了一遍,下面这个是按照我实践过的例子贴的经验,
三、Java项目调用
1、新建项目,引用jacob.jar
2、实现,直接贴代码
package test; //=================导包======================= import com.jacob.activeX.ActiveXComponent; import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import com.jacob.com.Variant; //=================导包======================= public class main { public static void main(String[] args) { // TODO Auto-generated method stub try { ComThread.InitSTA(); ActiveXComponent dotnetCom = null; //需要调用的C#代码中的命名空间名和类名。 dotnetCom = new ActiveXComponent("CalcTest.Calc"); //需要调用的方法名和参数值 Variant var = Dispatch.call(dotnetCom,"Add",1,2); String str2 = var2.toString(); //返回需要的字符串 System.out.println(str2.toString());//打印结果,结果等于3 } catch (Exception ex) { ex.printStackTrace(); }
finally { ComThread.Release(); } } }
声明:下面操作主要分为两部分,第一部分使用C#编写com为了写这篇文章我是新建的操作demo,
第二部分java调用c#编写的com组件,因为是工作时的demo,因为当时有给客户写了使用说明,在这里拿一些截图出来用一下,为了节省时间,我就不再操作一遍了,如有不理解的可以留言。
ok,对于整个操作过程就分享到这里了,如果有不理解的,或者我有讲的不对的请帮忙指出,谢谢。