本文分步介绍如何从 Visual Basic 6.0 调用 Visual Basic .NET 程序集以及如何从 Visual Basic .NET 调用 Visual Basic COM 组件。COM Interop 是 .NET Framework 的一个功能,它可以使非托管 COM 客户端使用托管 .NET 组件。COM Interop 还可以使 .NET 客户端使用 COM 组件。
向 Visual Basic .NET 客户端公开 Visual Basic 6.0 COM 组件
用作中间层商业应用程序或用作独立功能的现有 COM 组件是宝贵的资源。通过使用下面的工具,托管程序集可以使用这些 COM 组件:
- Visual Studio .NET
- 类型库导入程序工具 (Tlbimp.exe)
使用 Visual Studio .NET 使 COM 组件成为托管程序集
当您添加对特定的 COM 组件 .dll 或 .tlb 的引用时,Visual Studio .NET 将生成一个包含元数据的 Interop 程序集。要添加对类型库的引用,请按以下步骤操作:
- 在计算机上安装 COM .dll 或 .exe 文件。
您可以使用 Regsvr32.exe 工具注册 COM .dll。
- 在“项目”菜单上单击“引用”。
- 单击“COM”选项卡。
- 通过双击来从“可用的引用”列表中选择类型库,或者查找 .tlb 文件。
- 单击“确定”。
使用类型库导入程序工具 (Tlbimp.exe) 使 COM 组件成为托管程序集
Tlbimp.exe 是一个命令行工具,它可以将 COM 类型库中包含的组件对象类 (CoClasses) 和接口转换成元数据。此工具自动为类型信息创建一个 Interop 程序集和命名空间。在类的元数据可用后,托管客户端可以创建 COM 类型的实例并调用其方法。要从一个类型库生成 Interop 程序集,请使用下面的命令来生成 comcomponent.dll 程序集:
tlbimp YourCOMComponent.dll
如果您想让 .NET Interop 程序集使用一个不同的名称,请使用 /out:开关。例如,如果您要创建一个名为 ComAssembly.dll 的 .NET 程序集,请在命令提示符下键入下面的代码:
tlbimp YourCOMComponent.dll /out: COMAssembly.dll
向 COM 客户端公开 .NET Framework 程序集
当您要向 COM 应用程序公开 .NET 程序集中的类型时,请在设计时考虑下面的 COM Interop 要求。如果您遵循下面这些准则,托管类型(class、interface、struct、enum 等)就可以与 COM 类型紧密集成:
- 类应当显式实现接口。
- 将所有托管类型声明为公共类型。
只有程序集中的公共类型才会向类型库注册并导出到类型库中。它们只对于 COM 组件是可见的。
- 将方法、属性、字段和事件声明为公共的。
如果成员也是公共的,则公共类型的成员仅对于 COM 是可见的。如果您应用 ComVisibleAttribute,就可以限制程序集、公共类型或公共类型的公共成员的可见性。
默认情况下,所有的公共类型和成员对于 COM 均是可见的。
- 对于要从 COM 激活的类型,这些类型必须有公共的默认构造函数(没有参数的构造函数)。
托管的公共类型对 COM 是可见的。但是,如果没有公共的默认构造函数,COM 客户端就不能创建该类型。如果用一种不同的方式激活该类型,则 COM 客户端仍可以使用它。
- 类型不能是抽象的。
COM 客户端和 .NET 客户端都不能创建抽象类型。
注册 .NET 程序集
您必须先注册 .NET 程序集,然后 COM 客户端才能使用它。您可以使用 Tlbexp.exe 和程序集注册工具 (RegAsm.exe) 来注册 .NET 程序集。您可以通过使用 Tlbexp.exe 来创建能够被 COM 理解的 .tlb 文件。为此,请在命令提示符下键入下面的命令:
TlbExp AssemblyName /out:FileName
当 COM 客户端要与托管程序集对话时,这些客户端就会引用此 .tlb 文件。Tlbexp.exe 命令行工具可将程序集内包含的类和接口转换为 COM 类型库。当类的类型信息可用时,COM 客户端可创建 .NET 类的实例,并且这些客户端可以调用该实例的方法。
您必须使用 Regasm.exe 工具来注册 .NET 程序集。当您应用 /tlb: 选项时,Regasm.exe 可以生成并注册一个类型库。COM 客户端要求将类型库安装在 Windows 注册表中。如果不应用此选项,则 Regasm.exe 仅注册程序集中的类型,而不注册类型库。注册程序集内的类型和注册类型库是两种不同的活动。若要注册 .NET 程序集,请在命令提示符下键入下面的命令:
程序集可以是私有的,也可以是共享的。私有程序集与一个应用程序部署在一起,专供该应用程序使用(其他应用程序不能共享该私有程序集)。共享程序集可供计算机上的多个应用程序使用。若要创建共享程序集,必须在全局程序集缓存 (GAC) 中注册该程序集。若要将程序集添加到 GAC 中,请使用 GAC 工具 (Gacutil.exe)。若要使一个程序集成为共享程序集,请在命令提示符下键入下面的命令:
gacutil /i MyAssembly.dll
所有在 GAC 中注册的共享程序集都必须具有强名称。若要创建具有强名称的程序集,请按以下步骤操作:
- 在命令提示符下输入下面的命令来创建一个密钥文件:
sn -k KeyFileName.snk
- 打开 Visual Studio .NET 项目中的 AssemblyInfo 文件,将下面的代码添加到属性列表中以引用 KeyFileName(在第 1 步中创建),然后生成项目。
<Assembly: AssemblyKeyFile("KeyFileName")>
对于要在 COM Interop 中用到的程序集,必须在 Windows 注册表中注册该程序集和相应的类型库。这将使 COM 客户端能够透明地使用托管类型。
分步示例
向 Visual Studio .NET 公开 Visual Basic 6.0 COM 组件
- 打开 Visual Basic 6.0。
- 在“文件”菜单上,单击“新建项目”。
- 在“新建项目”对话框中,单击“ActiveX DLL”,然后单击“打开”。
默认情况下将创建“Class1”。
- 将下面的代码添加到 Class1 中,然后保存项目:
Public Function myFunction() As Integer myFunction = 10 End Function
- 在“文件”菜单上,单击“生成 Project1.dll”。
- 启动 Visual Studio .NET。在“文件”菜单上,单击“新建”,然后单击“项目”。
- 在“项目类型”下,单击选中“Visual Basic 项目”。
- 在“模板”下面,单击选中“Windows 应用程序”,然后单击“确定”。
默认情况下将创建Form1。
- 在解决方案资源管理器中,右键单击“引用”,然后单击“添加引用”。
- 单击“COM”选项卡,然后单击“浏览”。
- 定位到 Project1.dll,然后单击“打开”。
- 在“添加引用”窗口中单击“确定”。
Visual Studio .NET 将为 Project1.dll 生成一个名为 Interop.Project1.dll 的包装程序集。
如果您通过使用 Tlbimp.exe 工具手动生成 Interop 程序集,则可以通过使用“.NET”选项卡(而非“COM”选项卡)来在 Visual Studio .NET 中引用生成的程序集(按第 5 至 12 步介绍的方法)。在 Visual Studio .NET 命令提示符下键入下面的命令以手动生成 .NET 程序集:
tlbimp Project1.dll /out: MyProjectAssembly.dll
向 Visual Basic 6.0 公开 Visual Basic .NET 程序集
- 启动 Visual Studio .NET。在“文件”菜单上,单击“新建”,然后单击“项目”。
- 在“项目类型”下面,单击“Visual Basic 项目”。
- 在“模板”下面,单击“类库”。
- 将该项目命名为 TestProj,然后单击“确定”。
默认情况下将创建 Class1。
- 将下面的代码添加到 Class1 中:
Option Strict On Public Class Class1 Public Function myFunction() As Integer Return 100 End Function End Class
- 在解决方案资源管理器中,右键单击“项目名称”,然后单击“属性”。
- 在“配置属性”下,单击“生成”。
- 单击选中“为 COM Interop 注册”复选框,然后单击“确定”。
- 在“生成”菜单上,单击“生成解决方案”以生成该项目。
- 打开 Visual Basic 6.0。
- 在“文件”菜单上,单击“新建项目”,然后在“新建项目”对话框中单击选中“Standard EXE”。
默认情况下将创建“Form1”。
- 在“项目”菜单上单击“引用”。
- 在“可用的引用”列表中,双击以选中“TestProj”,然后单击“确定”。
- 在工具箱上双击“命令按钮”。
“Command1”将添加到“Form1”中。
- 双击“Command1”以打开“代码”窗口。
- 将以下代码添加到“Button1_Click”事件中:
Dim myObject As TestProj.Class1 Set myObject = New TestProj.Class1 MsgBox myObject.myFunction
- 在“运行”菜单上单击“开始”。
- 单击“Command1”。