VB.NET访问COM+

VB.NET 访问 COM+

摘要


1. 关于 COM+

2. VS.NET 访问 COM+

3. Demo

1 .关于 COM+

以前我们用 VB6 开发管理程序的时候,考虑到软件的扩充,维护以及不同客户端的情况,我们一般采用下面所谓的三层架构,其中 COM+ 一般用作中间层, COM+ 的一个主要特性就是它扩展了中间层组件以便其支持成百上千乃至上万同时访问的客户能力:

VB 开发的中间层直接采用 ADO 访问数据库,如果查询记录,一般返回 ADODB.RecordSet ,在商业逻辑层跟 UI 传递数据的时候,我们可以采用断开的记录集( Disconnected Recordset ),或者 Recordset 的 GetRows() 方法,返回数组,以及 XML 传递数据。

而且由于使用了 COM+ ,我们很容易把 UI 层改为浏览器形式的 Asp 文件,从而使得 Internet 调用 COM+ 。

2 . VS.NET 访问 COM+

有些应用程序需要与您自己的 COM+ 组件或与 Microsoft 及第三方提供的 COM+ 组件进行交互,或者处于升级的需要,我们不得不考虑 VS.NET 访问 COM+ 。为了简化这些应用程序的开发过程,公共语言运行时提供了一组功能,可以隐藏受控和非受控编程模型之间的差异,例如调用约定和错误处理。 Visual Studio .NET 通过这些功能来编写受控代码,来访问由 COM DLL 实现的功能,就好像 COM 接口是用受控代码编写的一样。这是因为当您在 Visual Studio .NET 中添加一个对 COM 类型库的引用时,就为类型库中说明的 COM 接口生成了受控包装程序。当然,这也意味着从受控代码访问 COM 功能时在性能上会有一点损失。

仔细考虑一下,我们现在是 .NET 的应用程序访问 VB 写的 COM+ ,两者的数据类型、调用机制、对象生存周期的管理等等都不尽相同,谁来协调两者的不同呢?那就是 RCW(Runtime Callable Wrapper) 。关系如下图:

_ _

RCW 充当一个“转换器的作用” , 通过它的作用机制使得 COM+ 像一个真正的 .NET 对象,从而能被 .NET 的应用程序使用。后面的处理就很简单了,我们所引用的 COM+ 充当一个 NameSpace ,可以方便使用其各种操作。

怎么样使用 RCW ?

有两种方式,如果你用 VS.NET 的集成开发环境,那很简单。只要,在 Project 的引用中加入要调用的 COM+ 对象,系统会自动生成并且加到程序中。

或者使用 tlbimp.exe (类型库导入程序)实用工具来自己生成一个程序集。可从大多数 COM 类型库生成程序集。如果该程序集是要共享的,则必须用发行者密钥对该程序集签名。 tlbimp.exe 可使用 /keyfile 选项生成签名的程序集。 其实,两者都是利用 System.Runtime.InteropServices.TypeLibConverter 来读取 COM+ ,产生 RCW 的程序集。

3 . Demo :

系统配置


OS : Win2k Advanced Server

Database : SQL Server

Develop Tools : VB6 & VS.NET

我们演示一个 .NET 调用 COM+ 的例子, COM+ 的一个 GetProducts 函数访问数据库 NorthWind ,返回一个 RecordSet 。然后在 .NET 中调用它,显示在 DataGrid 中。

首先创建一个简单的 COM+ :

打开 VB6 ,添加一个 Activex Dll ,把 Class1 的 Name 改为 Getter ,工程名改为 ComPlusDemo 。打开 Getter 的代码窗口,加入一下代码。

' 获取 Northwind 库中 Products 表中所有的产品名以及单价

Public Function GetProducts() As ADODB.Recordset
Dim cnn As ADODB.Connection
Dim cmd As ADODB.COMmand
On Error GoTo ErrorHandling
Set cnn = New ADODB.Connection
cnn.ConnectionString = "Provider=SQLOLEDB.1;Integrated Security=SSPI;" & _ "Persist Security Info=False;Initial Catalog=Northwind;Data Source=(local)" cnn.CursorLocation = adUseClient
cnn.Open
Set cmd = New ADODB.COMmand
cmd.ActiveConnection = cnn
cmd.COMmandText = "Select ProductName,UnitPrice from Products"
Set GetProducts = cmd.Execute
Exit Function
ErrorHandling:
Set GetProducts = Nothing
End Function


选择文件中编译,生成 ComPlusDemo.Dll 。

然后加入到 Win2k Server 的 Component Services 里面。

选择“管理工具”中的 Component Services ,如图:

右击选择 New->Application.出现COM Application Install的向导。点击下一步,选择Create an empty Application,点击出现一个输入新程序名的窗口,输入MyApp,下一步。保持默认选择,到结束。我们发现COM+ Applications里面多了一个MyApp:

然后选择MyApp右键,选择Components。New->component。出现安装组件的向导,选择安装新的组件,定位我们刚才编译好的Dll,知道配置结束。至此,我们Win2k的COM+就配置好了,是不是很烦:)后面调用就简单了。

.NET中调用COM+

新建一个应用程序,加一个datagrid和button。选择项目中添加引用,选择COM,把刚才编译好的DLL加到Project中去,ok,然后就可以调用了。

点击button,加入一下代码

Dim cmd As New OleDbDataAdapter()

Dim g As New COMPlusDemo.Getter()

Dim dst As New DataSet()

cmd.Fill(dst, g.GetProducts(), "Products")

dgdProducts.DataSource = dst


运行,点击 Button就可以看到datagrid,中填充了我们检索出来的商品名以及单价:是不是实现了COM+在.NET中的调用?下次将看一下如何反过来调用,从COM使用.NET。(待续)

Published At
Categories with Web编程
Tagged with
comments powered by Disqus