Chinaunix首页 | 论坛 | 博客
  • 博客访问: 565879
  • 博文数量: 190
  • 博客积分: 10937
  • 博客等级: 上将
  • 技术积分: 2205
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-07 11:28
文章分类

全部博文(190)

文章存档

2012年(1)

2011年(27)

2010年(20)

2009年(142)

我的朋友

分类:

2010-06-30 10:40:59

如果需要使用任一种支持.net的语言访问现有的COM+应用程序,我们无需修改现有COM+的一行代码,尽管它们的执行模式是完全不同的。我们可以使用前期绑定和后期绑定二种方法访问COM+,本文将具体介绍前期绑定的方法。
一、前期绑定
1、要求的工具
TlbImp.exe(类型库导入程序): 将在COM组件中发现的类型定义信息导入(转换、生成封装DLL)相应的.net定义(元数据)中,Ildasm.exe可以浏览TlbImp生成的元数据。如果使用的是Visual Studio开发环境,只要添加指向COM类型库的引用即可,转换工作就可以自动完成。
2、前期绑定实现对COM的访问
要使用现有的COM+应用程序,我们需要使用TlbImp.Exe创建Runtime Callable Wrapper(RCW运行库可调用的封装容器),在VS.Net开发环境中,只要我们调用现有的COM组件,就会自动地创建RCW。其区别是,VS.Net在创建RCW时使用了与原来的DLL文件相同的文件名,这有时会造成混淆。使用TlbImp.Exe,我们可以使用/out:参数来指定一个不同的文件名。
 
我们假设有一个有名字为Add的方法的COM组件,Add方法要求二个参数A和B,并返回SUM。
注意:在使用之前,我们必须首先注册COM DLL。
'CompAdd.Dll 
(class1) 
Public Function Add(A As Long, B As Long) As Long
 
Add = A + B
 
End Function
然后我们就可以对现有的DLL(在本例中为CompAdd.Dll)运行TlbImp.Exe了:
 
上面的命令会生成一个名字为CompAddRcw.dll的封装容器DLL,我们可以使用IlDasm.Exe来浏览DLL文件。
 
对IlDasm.Exe的讨论超出了本篇稿子的范围。我们可以简单地编写利用Wrapper DLL的代码,Wrapper DLL将调用实际的DLL文件。下面我们来研究完成这一工作所使用的C#代码。
 
使用/r:开关编译该段程序,例如,csc TestClient.cs /r:CompAddRcw.dll,然后执行编译后的程序,我们就在.net环境中调用了COM组件。
二、后期绑定
在后期绑定中,我们必须使用System.Reflection名字空间,它允许我们通过编程的方式访问任何组合体中的类型。下面我们将学习如何通过简单的4个步骤完成后期绑定。
·通过使用Type.GetTypeFromProgID("Project1.Class1")获得IDispatch接口。
·使用获得的类型IDActivator.CreateInstance(objAddType)创建实例。
·生成参数数组(如果需要)。
·使用objAddType.InvokeMember函数调用方法。
 
Type.GetTypeFromProgID方法用来加载COM对象的类型信息,对Activator.CreateInstance的调用返回COM对象的一个实例,InvokeMember函数用于调用COM对象的方法。
结束语:本篇文章给出了如何利用COM应用程序的最基本的概念,为了使代码显得简洁,我们没有给出相关的错误处理部分。

阅读(3241) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~