技术开发 频道

从感知客户端使用.NET 组件:创建一个.NET组件


    你将注意到这里有一个ClassInterface 的属性,此ClassInterface 被连接到Temperature 类型中,而它的值则被设置在了ClassInterfaceType.AutoDual 上。我们将看到在Snooping in on the generated Typelibrary这一章中引用这个属性的意义。现在,把它看成是告诉类型库生成工具(例如:REGASM.EXE and TLBEXP.EXE),把.NET 部件类型输出到生成的类型库中的默认的Class接口。同时也要记住一般不建议使用一个Class接口来展示.NET 类型的公共方法,因为COM 译本非常不可信。我们来看看使用接口怎样明确地完成同一事情。明确地定义一个接口,从这个接口派生你的.NET组件类型,然后在你的.NET 组件里执行这个接口方法,如果你准备相你的COM 感知客户端展示你的.NET 组件,这是一个非常值得推荐的方法。我们将详细比较这两个方法,在Snooping in on the generated Typelibrary这章中,可以看到为什么不推荐前一个方法。

    如果正在使用Visual Studio.NET,可以创建一个Visual C# 项目,使用类型库模版来编译上面的组件。如果是一个命令行操作员,然后这是建立这个组件的命令。这样创建了一个Temperature.dll程序集。
csc /target:library /r:System.Windows.Forms.dll 
/out:Temperature.dll TemperatureComponent.cs
从程序集生成类型库&注册程序集

    刚才所生成的是一个.NET 程序集,COM 感知客户端,例如:Visual Basic 6.0不能操作此.NET 程序集。你需要从此.NET 程序集得到某种COM 友好类型信息,因此我们的VB客户将会高兴地与它合作。先前使用了一个TLBIMP (类型库导入程序)工具,用它来从COM类型库创建一个.NET元数据代理。在这里要做与此相反的工作。你需要接受一个.NET 程序集,在此.NET程序集中生成一个类型库,因此它在COM 感知客户端是可以利用的。.NET 框架为此提供了一些工具。你可以使用类型库导入程序工具(TLBEXP.exe) 或者是使用程序集注册工具(Regasm.exe),在.NET SDK 安装的Bin 目录中。你可以找到类型库导入程序工具(TLBEXP.exe) 或者是程序集注册工具(Regasm.exe)。REGASM是TLBEXP工具的扩展集,它所作的不仅仅是操作一个类型库。它也被用来注册程序集,因此制造appropriate registry entries来推动COM运行库和.NET运行库,把COM 感知客户端连接到.NET组件中。在这里使用REGASM.EXE完成程序集注册和类型库生成。也能使用TLBEXP来生成类型库,然后用REGASM注册程序集。
regasm Temperature.dll /tlb:Temperature.tlb
   上面调用REGASM.EXE产生了正确的注册途径,并且从.NET程序集生成了一个类型库(Temperature.tlb),因此可以从VB 6 客户端应用程序引用类型库。

从VB 6.0客户端使用组件

    让我们迅速创建基于VB模式的应用程序,此应用程序创建并且调用.NET组件,并注册了.NET组件的程序集,并且从.NET组件程序集生成了一个类型库。此组件的创建和怎样创建一个COM 对象的方法一样。你可以引用类型库,前期绑定组件,或者可以通过使用组件ProgID,晚期绑定组件,以此来执行一个Create对象调用。通常,被生成的ProgID是与这个类型最相适合的名字。生成的ProgID可以是TemperatureComponent,但是也能使用ProgIDAttribute,指定一个用户定义的ProgID,覆盖被它生成的默认ProgID。
Collapse
Private Sub MyButton_Click()

On Error GoTo ErrHandler

Dim objTemperature As New TemperatureComponent

objTemperature.DisplayCurrentTemperature

objTemperature.Temperature = 52.7

objTemperature.DisplayCurrentTemperature

If (objTemperature.GetWeatherIndications() = _
WeatherIndications_Sunny) Then
MsgBox "Off to the beach"
Else
MsgBox "Stay at home and watch Godzilla on TV"
End If

Exit Sub

ErrHandler:

MsgBox "Error Message : " & Err.Description, _
vbOKOnly, "Error Code " & CStr(Err.Number)
End Sub
    使.NET程序集解析器能找到包含组件的程序集,你要么需要把同一目录中的组件当作正在使用它的应用程序, 或者在全局装配件缓存(全局程序集缓存 )中把程序集安置为一个共享程序集。现在把Temperature.dll复制到同一目录,作为可以执行的VB客户端应用程序。如果VB可以使用平常的基于Classic COM的调用机制,而且仍不需要调用并使用.NET组件,在VB6客户端和.NET组件之间有一个好的撒马利亚人,此撒马利亚人把COM调用请求连接到实际的.NET组件。不久我们就会看到简单的外表下面发生了什么。
0
相关文章