65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 VS 2005 创建 COM DLL:高级演练

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.60/5 (11投票s)

2009年7月7日

CPOL

7分钟阅读

viewsIcon

44943

本文演示了如何使用 VS 2005 手动创建 COM DLL。

引言

本文演示了如何使用 Visual Studio 2005 手动创建 COM DLL。它还演示了如何使用 gacutil.exe 将其安装到 GAC,以及如何使用程序集注册工具 (regasm.exe) 注册该库。

要了解如何以简单的方式创建 COM DLL,请参阅我的文章“使用 VS 2005 创建 COM DLL:演练”。

要了解如何以简单的方式注册 COM DLL,请参阅我的文章“使用 VS 2005 注册 COM DLL 演练”。

 

背景 

在我发布了极其简单的文章“使用 VS 2005 创建 COM DLL:演练”一年后,我惊讶地发现评分低于 5 的不少。我想,可能有很多开发人员想知道这个问题的答案:“我如何以困难的方式做到这一点?”好吧,对于那些受虐狂般但又细致入微的好奇心强的头脑,这里是方法……

顺便说一句,我正在考虑写一篇关于“使用 Visual Basic 命令行编译器创建 COM DLL”的文章,届时将使用 Notepad 和 Vbc.exe,所以如果你真的喜欢硬核操作,可以关注一下。

 

创建 COM DLL 项目

*** 顺便说一句,请仔细遵循这些说明。
*** 如果完成后 COM DLL 无法正常工作,则可能是您遗漏了某些内容。
 

首先,让我们创建一个新的 Visual Basic.NET 类库。

  • 打开 Visual Studio 2005。
  • 点击文件菜单 | 新建 | 项目…
  • 在“新建项目”窗口中,选择
    • “项目类型”下的“Visual Basic”。
    • “模板”下的“类库”。
    • 将“名称”输入为“MyComDemo”。
    • 勾选“为解决方案创建目录”。
    • 完成后,单击“确定”按钮。
 
1_-_NewProjectMenu.jpg

 

编程类

首先,请注意,当 Visual Studio 创建项目时,它会自动添加一个名为“Class1”的类。让我们开始编程,将“Class1”的名称更改为更具意义的名称,例如“MyCalculator”。

  • 查看解决方案资源管理器(“视图”菜单 |“解决方案资源管理器”)。
  • 右键单击 Class1.vb,然后从下拉菜单中选择“重命名”。

2_-_ChangeClassName.jpg 

  • 将文件名从“Class1.vb”更改为“MyCalculator.vb”。(这将同时更改文件名和类名。)
3_-_ChangeClassName.jpg 

让我们向类中添加一个方法,以后我们可以从 VB6 调用它。

5_-_DisplayMsgSub.jpg 

 

使其 COM 可互操作

现在我们已经编写了类,可以使其 COM 可互操作了。

我们需要做的第一件事是导入 System.Runtime.InteropServices 命名空间。这是获取必要的互操作属性所必需的。

将以下内容添加到类的顶部:

            Imports System.Runtime.InteropServices

 

定义接口

接下来,我们需要为我们的类定义一个接口。这是必需的,因为 COM 客户端使用它与 COM 对象进行通信。

要为我们的类定义接口,我们将把 <ClassInterface()> 属性添加到我们的类中,这将自动为我们生成一个接口。这将确保我们的类的每个公共成员都将公开给 COM。

  • 虽然技术上是可选的,但将此属性添加到类中可以使 COM 调用者利用早期绑定,早期绑定比后期绑定更类型安全,并能带来更好的性能。
  • 我们要公开给 COM 的项目中的每个类都需要添加此属性。
  • ClassInterface() 构造函数有 3 个可用选项,我们将使用 AutoDual。
    • AutoDispatch:接口仅支持后期绑定。
    • AutoDual:接口支持早期绑定和后期绑定。
    • None:接口不支持早期绑定或后期绑定。(如果您创建了自己的强类型接口,可以使用此选项。)

现在我们的类应该看起来像这样:

6_-_Interface.jpg 

 

添加 GUID

添加接口后,我们将需要添加一个特定的 GUID,它是一个 128 位数字,添加到注册表中,用于标识 COM 类型。(GUID 是全局唯一标识符)。

生成 GUID

  • 单击“工具”菜单 |“创建 GUID”。
  • 选择“注册表格式”选项。
  • 单击“复制”按钮将新的 GUID 复制到 Windows 剪贴板。
  • 单击“退出”按钮关闭窗口。

7_-_GUID.jpg 

 

现在我们有了 GUID,让我们在 ClassInterface() 属性和类声明之间添加 Guid() 属性。然后粘贴 GUID。* 务必删除花括号 {}。

现在您的类应该看起来像这样:

8_-_AddGUID.jpg 

 

定义强名称 

所有 COM 互操作程序集都应进行签名并安装到 GAC(全局程序集缓存)中。如果程序集未安装到 GAC,那么它需要复制到使用它的 COM 程序所在的同一个文件夹,但这在技术上不是必需的。

签名程序集

  • 单击“项目”菜单 |“MyComDemo 属性…”。
  • 单击“签名”选项卡。
  • 勾选“签名程序集”复选框。
  • 从“选择强名称密钥文件:”下拉列表中选择“新建…”。
  • 创建强名称密钥窗口
    • 创建文件名(例如,“MyComDemoKey”)。
    • 输入并确认密码(可选)。
    • 按“确定”按钮。
    • 保存并关闭属性。

9_-_Signing.jpg 

 

注册 COM 互操作 

由于属性窗口已打开,请单击“编译”选项卡,然后在窗口底部勾选“注册 COM 互操作”。

10_-_RegisterForComInterop.jpg 

最后,保存并关闭属性窗口。

 

注册我们的 COM 互操作库 

现在所有设置都已完成,将解决方案配置从“调试”更改为“发布”,然后保存并编译项目。

接下来,打开 Visual Studio 命令提示符。

  • 从 XP 开始菜单,导航到 Microsoft Visual Studio 菜单 | Visual Studio Tools | Visual Studio 2005 Command Prompt。
  • 导航到已编译的 .dll 所在的目录(bin\Release 文件夹)。

GAC:使用“gacutil.exe”实用程序将库安装到全局程序集缓存中,使我们的 .dll 对所有 .Net 程序集全局可用,并防止它们被复制到引用程序集的应用程序目录中。

  • 在将程序集注册到 GAC 之前,我们必须定义一个强名称(请参阅上面的“定义强名称”)。
  • 在命令提示符下,键入以下命令,然后按 Enter:

            gacutil –i MyComDll.dll 

11_-_GacInstall.jpg  

注册表:使用“Regasm.exe”实用程序将库注册到 Windows 注册表中,使我们的 COM 类型库 .tlb (.dll) 对所有 VB6 程序集全局可用。

  • 在命令提示符下,键入以下命令,然后按 Enter:

            regasm MyComDll.dll /tlb:MyComDll.tlb

12_-_RegAsm.jpg 

  • 我们的 COM 类型库 (.tlb) 已创建,并可用于 VB6。

注意:“TlbExp.exe”是另一个可用于从 .NET 程序集生成 COM 类型库的实用程序,但它不会将其注册到 Windows 注册表中。

 

在 VB6 中使用我们新的 COM DLL 

现在我们有了一个功能齐全的 COM DLL,可以用于 VB6。让我们进入 VB6 看看如何使用它。

创建新的 VB6 项目

  • 启动 VB6。
  • 当“新建项目”窗口打开时,选择“标准 EXE”。
  • 单击“打开”按钮。
  • 在窗体上添加一个按钮,然后双击它以创建 Click() 事件,并打开代码窗口。

添加对我们新的 COM DLL 的引用

  • 单击“项目”菜单 |“引用…”。
  • 在“可用引用:”列表框中,向下滚动直到找到我们新的库“MyComDemo”,然后勾选它。
  • 单击“确定”按钮关闭“引用”窗口。

13_-_Vb6Ref.jpg 

 

最后,在我们的命令按钮的 Click() 事件中,添加以下代码来使用我们新的库:

    Private Sub Command1_Click()

        Dim calc As New MyCalculator
        Dim result As Integer
    
        result = calc.Add(5, 5)
    
        MsgBox result
    
    End Sub

测试我们新的 COM DLL

  • 运行 VB6 应用程序(按 F8 或“调试”菜单 |“单步执行”)。
  • 单击窗体上的按钮。

这是我们测试的结果:

14_-_Vb6Output.jpg

 

清理。

完成本文的学习后,您可能希望从注册表中删除我们创建的库。方法如下:

  • 打开 Visual Studio 命令提示符。
  • 导航到已编译的 .dll 所在的目录(bin\Release 文件夹)。
  • 在命令提示符下,键入以下命令,然后按 Enter:

            gacutil –u MyComDll.dll

15_-_Unregister.jpg

 

结论

正如您所见,以手动方式创建 COM DLL,包括将其安装到 GAC 和注册到注册表,需要做更多的工作。

需要注意的一点是,如果您尝试将 COM DLL 安装到 GAC 并将其注册到注册表中,但使用的不是您自己的开发 PC,您可能会发现 gacutil 和 regasm 未安装。如果发生这种情况,您需要安装 .NET Framework Tools。此处有一个链接,其中提供了有关它们的更多信息:

.NET Framework Tools。

 

© . All rights reserved.