|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
一旦你有了思想,那你编的程序就有了灵魂,不管是什么语言到了你的手里都会是你的工具而已,他们的价值是能尽快帮助你实现你想要的目标。但是如果你没有了思想,那就像是海里的帆船失去了船帆,是很难到打海的另一边的。前两天公司有这么个需求:用C#写一个COM组件,供应接口让Java来挪用,完成Java和C#之间的接口通讯。如许子倒好办,我用C#写一个COM组件也就是几分钟的事变,Java也能够用jacob十分便利地挪用C#写好的COM接口。可是对方java项目组又请求我在C#COM接口中界说一系列事务,由java端完成事务的详细办法,换句话说我不但要完成客户端(java端)挪用服务端(c#com端),并且又要经由过程事务机制完成服务端挪用客户端。如今把详细完成的历程纪录上去,供本人从此查阅,也供碰到一样成绩的伴侣查阅,但愿能给必要的伴侣带来匡助。
1、C#编写带事务机制的COM组件
起首我们新建一个类库项目叫做COM_Tester,右键点击工程->使用程序->程序集信息->使程序集com可见,打上勾,以下图所示:
<br>
右键点击工程->天生->为comInterop注册打上勾
<br>
好了,如许设置今后我们静态库就能够以COM的情势注册到注册表了,也就是说java能够看到这些接口并挪用了,那接上去就是来写COM接口了。
起首界说COM接口,C#代码以下:
1
2
3
4
5
6
7
[Guid("7EEDF2D8-836C-4294-90A0-7A144ADC93F9")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
publicinterfaceITester
{
[DispId(1)]
voidDraw(stringtext);
}
注重,这里的Guid值能够经由过程点击工具->创立GUID->选择4->NewGuid->copy->粘贴到别的就行
因为必要用到事务机制,我们再来界说事务接口,C#代码以下:
1
2
3
4
5
6
7
[Guid("7FE32A1D-F239-45ad-8188-89738C6EDB6F")]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
publicinterfaceIEventTester
{
[DispId(2)]
voidDrawEvent(stringtext);
}
然后我们来界说一个类来完成ITester接口作为COM接口的主类,C#代码以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[Guid("76BBA445-7554-4308-8487-322BAE955527"),
ClassInterface(ClassInterfaceType.None),
ComDefaultInterface(typeof(ITester)),
ComSourceInterfaces(typeof(IEventTester)),
ComVisible(true)]
publicclassMyCom:ITester
{
publicdelegatevoidDrawDelegate(stringtext);
//注重事务的称号必需和IEventTester界说的名字分歧,并且必需public
publiceventDrawDelegateDrawEvent;
#regionITester成员
publicvoidDraw(stringtext)
{
OnDraw(text);
Console.WriteLine("Iamdrawing...");
}
publicvoidOnDraw(stringtext)
{
if(DrawEvent!=null)
DrawEvent(text);
}
#endregion
}
好了,带事务的COM接口就写好了。
2、Java端使用jacob来挪用COM并将java写的事务呼应函数传送给COM
怎样利用jacob,能够参看http://danadler.com/jacob/,这里就不具体先容了。
Java代码以下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
importcom.jacob.activeX.ActiveXComponent;
importcom.jacob.com.Dispatch;
importcom.jacob.com.DispatchEvents;
importcom.jacob.com.Variant;
publicclassJavaTester{
publicstaticvoidmain(String[]args){
ActiveXComponentdotnetCom=newActiveXComponent("COM_Tester.MyCom");
Dispatchtest=(Dispatch)dotnetCom.getObject();
SensorEventsse=newSensorEvents();
DispatchEventsde=newDispatchEvents(test,se);
Dispatch.call(test,"Draw",newVariant("123"));
}
}
1
2
3
4
5
6
7
8
9
importcom.jacob.com.Variant;
publicclassSensorEvents{
publicvoidOnDraw(Variant[]i){
System.out.println("thisisjavaeventexecuted");
}
}
注重:OnDraw事务称号要与C#界说的OnDraw分歧,如许jacob会主动寻早婚配的事务;参数要用Variant[]范例,那次我由于用了Variant分歧没法乐成。
好了,如许我们就可以乐成完成Java挪用带事务的C#COM接口了,但愿能给人人带来匡助。
有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。 |
|