让.NET兼容COM

ZDNet软件频道 时间:2001-08-15 作者: |  我要评论()
本文关键词:.Net COM VSNETB2CHN
我将向你展示如何对付这种情况并指出在这个过程中一些容易犯错误的地方.

围绕微软.NET的许多问题中的一个是它是否将快速的被开发者采用.即使你的公司马上就开始使用.NET,Visual Basic.NET中语法上的改变意味着你现存的所有程序可能不能被马上转换到新的语言上去.这就会引发一种情况:你已有一个使用几种COM服务的VB客户端程序,而它现在需要访问一个新的.NET组件.在本文中,我将向你展示如何对付这种情况并指出在这个过程中一些容易犯错误的地方。

大多数专家认为.NET的前途在很大程度上取决于它是否能和现存的COM应用程序很好的合作.微软当然清楚这一点并且为使.NET能够容易的向后兼容COM做了大量的工作.

请在这里注册
首先,让我们回忆一下系统是如何管理COM库的.当一个COM组件被安装以后,有几个注册表条目必须被创建来告诉系统组件被安装的位置并提供组件中所有类的名字.组件还会提供一个类型库,这个类型库包括了组件中类的信息,就像方法签名一样.

相反的,.NET组件在安装的时候不需要以传统的方式注册,而且它们也不提供类型库:这些信息包含在组件编码的内部,在一个叫做"名单"的组成部分里.有一个命令行实用程序RegAsm.exe可以用来生成一个COM客户运行这个组件所需的注册表的相关改动和类型库.当一个.NET组件被注册而且它的类型库已经被创建以后,它就能完全象一个COM组件一样被使用;早期的和延迟的绑定过程都将被支持.

例子
让我们来看一个相关的例子.在列表A中,我创建了一个VB.NET类库的样例,它以几个不同的数据类型返回Timer()函数的值并提供一个可以通过调用ShowForm()方法来显示的简单的表单.在列表B中,我创建了一个使用这个组件的VB6客户端应用程序.你可以在这里下载源代码和编译过的服务器和客户端程序.

假设你已经安装了.NET Framework:

1.下载编译过的工程并将Net2COMSample.dll解压缩到一个临时文件夹里.
2.打开一个DOS窗口并将路径改到和Net2COMSample.dll一样的目录里.
3.用下列命令注册Net2COMSample.dll并创建它的类型库:RegAsm Net2COMSample.dll /tlb Net2COMSample.tlb
4.在Visual Basic 6中打开DotNetClient工程.
5.将工程编译到Net2COMSample.dll所在的文件夹(后面会解释为什么要这样)然后运行这个exe程序.

到此为止,你应该可以点击客户应用程序窗体上的任何按钮来调用他们相应的.NET方法了.就像这个例子展示的那样,通过这种机制甚至有可能显示一个.NET窗体.

如果你用VB6 object browser工具查看Net2COMSample,如图A,你会注意到这个库文件在它的源代码中包含了不止四个方法.

图A


所有这个额外的方法都是从SampleClass的基类Object那儿继承而来的,而且其本身对Visual Basic是可以调用的.

几点注意事项
乍一看,让VB6程序能够使用.NET组件是简单的,但是你要记住下面的几点:

1.VB6不知道如何向一个类的构造函数传递变量,所以要确保.NET类有一个恰当的构造函数.
2.虽然大多数.NET原始变量类型能够无碍的影射(匹配)到VB6相应的类型上去,但是要记住一些变量类型的名字改变了,还有一些老的名字现在有了新的含义(例如VB6的Integer类型).
3.因为.NET用来定位组件的方法,服务组件必须要么位于客户程序同样的目录里,要么位于Global Assembly Cache(全局组件缓存)中.
4.记住,到我写这篇文章的时候,VB.Net还是一个beta测试版.

总结
软件维护的现状意味着很少现存的VB程序会被马上转换到VB.NET中来.进一步来说,这些现状还有可能要求现存的应用程序需要在它们真的发现要被转换之前就尽早被加强.利用微软在.NET中加入的向后兼容性能够使转换到新环境中的过程更容易.
 


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134