- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第五章COM与NET互操作.doc
第五章 COM与NET互操作
引言
C#.NET编译形成的目标文件,由MSIL构成,它运行时必须得到Common Library Runtime(CLR)的支持,这种代码称为“托管代码(managed code)”。
而Delphi是Borland公司推出的编程平台,在其第8版之前开发的程序,编译形成的目标代码是Win32,不是MSIL,故不可能在CLR中运行。
当利用C#编写软件时,需重用原来的原来的COM组件。按惯例软件应提供“向后兼容”能力,用VB、C++等语言开发的程序被C#调用,为“C#.NET正向调用Delphi模块”。
当将Delphi编写的软件迁移到带有.NET平台的操作系统,如Windows vista时,如何升级应用程序,使之能与新OS高效无缝地集成呢?
C#.NET正向调用COM模块
“网络异构”的解决是在路由器中进行,采用的方法是“存贮转发”,先将某种协议的数据接收到路由器中,经协议转换后,再由指定的端口转发出去。
C#模块与Delphi模块的代码方式不同,相当于两种不同的协议,必须在两者间建立一个类似路由器的模块,它就是微软提供的“Runtime-Callable Wrapper (RCW)”,
当C#.NET模块调用Delphi模块(已改造为组件即COM)时,
将MSIL转换为普通的二进制,并按Delphi模块(COM组件)的要求编组(marshal)。
COM组件执行完毕后,要将结果转换为MSIL格式,并按.NET组件的要求编组,其工作原理图如下:
图1 C#模块调用早期模式
图1展示C#.NET的应用程序Netcallcom.exe跨越代理RCW,调用Unmanaged code型Delphi模块(COM组件)ComFindPrime.exe的过程。
从图1中可以看出,代理RCW横跨在Managed Code与Unmanaged Code的边界,在RCW的左边运行的CLR环境中C#应用程序,在RCW的右边运行的是Win32环境的Delphi模块(COM组件),而代理RCW本身应运行在CLR平台,它对外调用Delphi模块(COM组件)。
RCW采用“静态调用”的机制,在编译阶段就必须获取Delphi模块(COM组件)的接口信息。
按Delphi模块(COMCOM组件规范)要求,须先建立一个或多个接口,将该组件能对外开放的方法写入其中,然后编写这些接口的实现类,编译器按COM组件规范的要求,形成一个EXE或DLL文件。
调用者在使用这些组件时,它必须通过某种方式获取这些接口信息.
获取接口信息的技术称为“反射机制”,
接口信息也称为“Metadata(元数据)”,
高级语言的编程平台即编译型平台,通过工具它可以获取这些元数据,并将其放在“type library(类型库)”,
编辑器可以对代码进行语法检查,
有些编辑器还具有智能感知功能,自动显示该接口中的公共方法,
值得注意的是,COM组件的接口中是不允许出现属性、索引等部件,但是在接口的实现类中可以出现,有些开发平台也对COM组件的规范进行扩充,允许其中可以定义公共的属性或公共的索引。
.NET平台获取元数据的方式有:
TLBIMP(type library importer 类库导入器)工具,
Solution Explorer中的Add Reference工具。
方式一:执行“开始(程序(Microsoft Visual Studio .NET 2003(Visual Studio .NET 工具(在Visual Studio .NET 2003 命令提示”进入.NET的命令提示符,
键入tlbimp/?会显示出该工具各种使用方式,在2011年
进入COM组件“ComFindPrime.EXE”所在的文件夹,
执行tlbimp ComFindPrime.EXE /out:NETComFindPrime.dll,
Tlbimp从COM类型库中读元数据,
产生匹配CLR的Assembly,供.NET调用COM组件使用。
执行以上操作后,在Solution Explorer中执行Add Reference时选择.NET 标签条(tab),表示要到.NET组件中寻找它,若列表中没有则请单击“Browse”按钮,去tlbimp执行时所在的文件夹中寻找。
若要供多个.NET的客户端使用,还要在GAC中注册与添加公钥/私钥对等工作。
在命令行上键入“tlbimp/?”可以查询到所有的选项,实际上是查询tlbimp的接口信息,这是DOS时代最常见的方式。
到了Windows时代,接口信息越来越复杂了,须专门建立类型库,所以接口信息或元数据,并不是新鲜工具,其实在远古的DOS时代就已存在。
方式二:在Solution Explorer中右击“Refer
文档评论(0)