HOW TO:从 Visual Basic 6.0 调用 Visual Basic .NET 程序集以及从 Visual Basic .NET 调用 Visual Basic COM 组件

文章翻译 文章翻译
文章编号: 817248 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文分步介绍如何从 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 程序集。要添加对类型库的引用,请按以下步骤操作:
  1. 在计算机上安装 COM .dll 或 .exe 文件。

    您可以使用 Regsvr32.exe 工具注册 COM .dll。
  2. 在“项目”菜单上单击“引用”。
  3. 单击“COM”选项卡。
  4. 通过双击来从“可用的引用”列表中选择类型库,或者查找 .tlb 文件。
  5. 单击“确定”。

使用类型库导入程序工具 (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 要求。如果您遵循下面这些准则,托管类型(classinterfacestructenum 等)就可以与 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 程序集,请在命令提示符下键入下面的命令:
RegAsm AssemblyName /tlb: FileName.tlb

共享程序集和私有程序集

程序集可以是私有的,也可以是共享的。私有程序集与一个应用程序部署在一起,专供该应用程序使用(其他应用程序不能共享该私有程序集)。共享程序集可供计算机上的多个应用程序使用。若要创建共享程序集,必须在全局程序集缓存 (GAC) 中注册该程序集。若要将程序集添加到 GAC 中,请使用 GAC 工具 (Gacutil.exe)。若要使一个程序集成为共享程序集,请在命令提示符下键入下面的命令:
gacutil /i MyAssembly.dll
所有在 GAC 中注册的共享程序集都必须具有强名称。若要创建具有强名称的程序集,请按以下步骤操作:
  1. 在命令提示符下输入下面的命令来创建一个密钥文件:
    sn -k KeyFileName.snk
  2. 打开 Visual Studio .NET 项目中的 AssemblyInfo 文件,将下面的代码添加到属性列表中以引用 KeyFileName(在第 1 步中创建),然后生成项目。
    <Assembly: AssemblyKeyFile("KeyFileName")>
对于要在 COM Interop 中用到的程序集,必须在 Windows 注册表中注册该程序集和相应的类型库。这将使 COM 客户端能够透明地使用托管类型。

分步示例

向 Visual Studio .NET 公开 Visual Basic 6.0 COM 组件

  1. 打开 Visual Basic 6.0。
  2. 在“文件”菜单上,单击“新建项目”。
  3. 在“新建项目”对话框中,单击“ActiveX DLL”,然后单击“打开”。

    默认情况下将创建“Class1”。
  4. 将下面的代码添加到 Class1 中,然后保存项目:
    Public Function myFunction() As Integer
        myFunction = 10
    End Function
  5. 在“文件”菜单上,单击“生成 Project1.dll”。
  6. 启动 Visual Studio .NET。在“文件”菜单上,单击“新建”,然后单击“项目”。
  7. 在“项目类型”下,单击选中“Visual Basic 项目”。
  8. 在“模板”下面,单击选中“Windows 应用程序”,然后单击“确定”。

    默认情况下将创建Form1
  9. 在解决方案资源管理器中,右键单击“引用”,然后单击“添加引用”。
  10. 单击“COM”选项卡,然后单击“浏览”。
  11. 定位到 Project1.dll,然后单击“打开”。
  12. 在“添加引用”窗口中单击“确定”。

    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 程序集

  1. 启动 Visual Studio .NET。在“文件”菜单上,单击“新建”,然后单击“项目”。
  2. 在“项目类型”下面,单击“Visual Basic 项目”。
  3. 在“模板”下面,单击“类库”。
  4. 将该项目命名为 TestProj,然后单击“确定”。

    默认情况下将创建 Class1。
  5. 将下面的代码添加到 Class1 中:
    Option Strict On
    
    Public Class Class1
       Public Function myFunction() As Integer
          Return 100
       End Function
    End Class
  6. 在解决方案资源管理器中,右键单击“项目名称”,然后单击“属性”。
  7. 在“配置属性”下,单击“生成”。
  8. 单击选中“为 COM Interop 注册”复选框,然后单击“确定”。
  9. 在“生成”菜单上,单击“生成解决方案”以生成该项目。
  10. 打开 Visual Basic 6.0。
  11. 在“文件”菜单上,单击“新建项目”,然后在“新建项目”对话框中单击选中“Standard EXE”。

    默认情况下将创建“Form1”。
  12. 在“项目”菜单上单击“引用”。
  13. 在“可用的引用”列表中,双击以选中“TestProj”,然后单击“确定”。
  14. 在工具箱上双击“命令按钮”。

    “Command1”将添加到“Form1”中。
  15. 双击“Command1”以打开“代码”窗口。
  16. 将以下代码添加到“Button1_Click”事件中:
    Dim myObject As TestProj.Class1
    Set myObject = New TestProj.Class1
    MsgBox myObject.myFunction
  17. 在“运行”菜单上单击“开始”。
  18. 单击“Command1”。

参考

有关更多信息,请访问下面的 Microsoft Web 站点:
与非托管代码交互操作
http://msdn.microsoft.com/library/en-us/cpguide/html/cpconinteroperatingwithunmanagedcode.asp

属性

文章编号: 817248 - 最后修改: 2003年12月23日 - 修订: 2.1
这篇文章中的信息适用于:
  • Microsoft Visual .NET 2002 标准版
  • Microsoft Visual Basic .NET 2003 标准版
  • Microsoft Visual Basic 6.0 企业版
  • Microsoft Visual Basic 6.0 学习版
  • Microsoft Visual Basic 6.0 专业版
  • Microsoft .NET Framework 1.0
关键字:?
kbhowtomaster kbinterop kbnamespace kbdll kbautomation kbcominterop KB817248
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com