VB.NET访问COM+

原创 2002年09月19日 17:49:00

VB.NET访问COM+

 

摘要

1.  关于COM+

2.  VS.NET访问COM+

3.  Demo

      

1.关于COM+

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

 

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

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

      

       2VS.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的程序集。

3Demo:

 

系统配置

OSWin2k Advanced Server

DatabaseSQL Server

Develop ToolsVB6 & VS.NET

 

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

首先创建一个简单的COM+

打开VB6,添加一个Activex Dll,把Class1Name改为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 ServerComponent 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。(待续)

 

 

vb.net 封装组件成com的方法

 方法如下:  新建一个 项目 ,选择 Visual Basic / Window / 类库 ,假设项目名为ClassLibrary1  然后 在 solution manager(解决方案资源管理器...
  • cooldidi1
  • cooldidi1
  • 2007年10月07日 19:34
  • 487

在 vb.NET 中使用 COM+ 服务

 查看原帖2002-04-29 15:33作者: 出处:Microsoft责任编辑:  摘要:将新的 Microsoft .NET 组件添加到现有的 COM 和 COM+ 应用程序中,它们将协同工作;...
  • kenkao
  • kenkao
  • 2009年05月15日 15:27
  • 1823

.Net下开发COM+组件

一、问题的提出1、最终用户的每次请求,都将读取Mapping文件--可以通过缓存解决; 2、子系统需要不断的写入Mapping文件--也可以先写入内存然后批量写入文件解决; 二、分析解决问题由于分别有...
  • yellow1234
  • yellow1234
  • 2007年11月02日 18:30
  • 339

com 与com+加是有什么区别

COM的产生         在以前程序设计过程中,程序员把它们的函数库放在一个叫做目标(Object)文件的单独文件中,在这些文件中,包含了编译过的代码。当程序员要使用一个特别的目标文件的时...
  • guomei
  • guomei
  • 2007年06月23日 17:13
  • 620

COM+无法与Microsoft分布式事务协调程序交谈

此问题针对HTTP500内部错误解决方法中的第三步:[同步com+应用程序所用的IWAM_MACHINE的密码 ]而写因为无法完成第三步使得500的问题很难解决保证com+ 应用程序能正常运行一般情况...
  • zxzmww
  • zxzmww
  • 2007年08月15日 22:26
  • 3207

windows server 2008 r2 COM+配置

1 服务器角色,增加“应用程序服务器”。 2 组件服务-计算机-我的电脑-属性-默认属性页的默认身份验证级别是“连接”,默认模拟级别是“标识” 3 COM安全页-访...
  • yz304zhang
  • yz304zhang
  • 2017年02月14日 11:13
  • 751

C#、VB.NET使用HttpWebRequest访问https地址(SSL)的实现方法

view sourceprint?using System.Net; using System.Net.Security; using System.Security.Authen...
  • liehuo123
  • liehuo123
  • 2010年12月27日 18:53
  • 5610

新事务之一: dotNET和COM+中的事务(2)

新事务之一: dotNET和COM+中的事务 小气的神2002-4-16 Article Type: In-Depth  难度等级:6/9        版本:2.32CLR中和事务相关的属性类属性类...
  • ccBoy
  • ccBoy
  • 2002年04月22日 09:36
  • 1574

delphi操作windows COM+组件服务二

使用COM接口1. 找到接口描述文件COMAdmin_TLB.pas还是用了个笨办法,新建一个ActiveX Library,再新建一个COM Object,随便起个名字吧。保存。然后选菜单View-...
  • jian704
  • jian704
  • 2008年05月23日 17:21
  • 1212

浅谈事务、COM+及分布式事务

浅谈事务、COM+及分布式事务 目录1     什么是事务及特性.......................................................................
  • bloglife
  • bloglife
  • 2008年02月17日 14:51
  • 2566
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:VB.NET访问COM+
举报原因:
原因补充:

(最多只允许输入30个字)