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。(待续)