使用 VS 2005 创建 COM DLL:高级演练
本文演示了如何使用 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”。
- 勾选“为解决方案创建目录”。
- 完成后,单击“确定”按钮。

编程类
首先,请注意,当 Visual Studio 创建项目时,它会自动添加一个名为“Class1”的类。让我们开始编程,将“Class1”的名称更改为更具意义的名称,例如“MyCalculator”。
- 查看解决方案资源管理器(“视图”菜单 |“解决方案资源管理器”)。
- 右键单击 Class1.vb,然后从下拉菜单中选择“重命名”。
- 将文件名从“Class1.vb”更改为“MyCalculator.vb”。(这将同时更改文件名和类名。)

让我们向类中添加一个方法,以后我们可以从 VB6 调用它。
使其 COM 可互操作
现在我们已经编写了类,可以使其 COM 可互操作了。
我们需要做的第一件事是导入 System.Runtime.InteropServices 命名空间。这是获取必要的互操作属性所必需的。
将以下内容添加到类的顶部:
Imports System.Runtime.InteropServices
定义接口
接下来,我们需要为我们的类定义一个接口。这是必需的,因为 COM 客户端使用它与 COM 对象进行通信。
要为我们的类定义接口,我们将把 <ClassInterface()> 属性添加到我们的类中,这将自动为我们生成一个接口。这将确保我们的类的每个公共成员都将公开给 COM。
- 虽然技术上是可选的,但将此属性添加到类中可以使 COM 调用者利用早期绑定,早期绑定比后期绑定更类型安全,并能带来更好的性能。
- 我们要公开给 COM 的项目中的每个类都需要添加此属性。
- ClassInterface() 构造函数有 3 个可用选项,我们将使用 AutoDual。
- AutoDispatch:接口仅支持后期绑定。
- AutoDual:接口支持早期绑定和后期绑定。
- None:接口不支持早期绑定或后期绑定。(如果您创建了自己的强类型接口,可以使用此选项。)
现在我们的类应该看起来像这样:

添加 GUID
添加接口后,我们将需要添加一个特定的 GUID,它是一个 128 位数字,添加到注册表中,用于标识 COM 类型。(GUID 是全局唯一标识符)。
生成 GUID
- 单击“工具”菜单 |“创建 GUID”。
- 选择“注册表格式”选项。
- 单击“复制”按钮将新的 GUID 复制到 Windows 剪贴板。
- 单击“退出”按钮关闭窗口。
现在我们有了 GUID,让我们在 ClassInterface() 属性和类声明之间添加 Guid() 属性。然后粘贴 GUID。* 务必删除花括号 {}。
现在您的类应该看起来像这样:
定义强名称
所有 COM 互操作程序集都应进行签名并安装到 GAC(全局程序集缓存)中。如果程序集未安装到 GAC,那么它需要复制到使用它的 COM 程序所在的同一个文件夹,但这在技术上不是必需的。
签名程序集
- 单击“项目”菜单 |“MyComDemo 属性…”。
- 单击“签名”选项卡。
- 勾选“签名程序集”复选框。
- 从“选择强名称密钥文件:”下拉列表中选择“新建…”。
- 创建强名称密钥窗口
- 输入并确认密码(可选)。
- 按“确定”按钮。
- 保存并关闭属性。
- 创建文件名(例如,“MyComDemoKey”)。
注册 COM 互操作
由于属性窗口已打开,请单击“编译”选项卡,然后在窗口底部勾选“注册 COM 互操作”。
最后,保存并关闭属性窗口。
注册我们的 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
注册表:使用“Regasm.exe”实用程序将库注册到 Windows 注册表中,使我们的 COM 类型库 .tlb (.dll) 对所有 VB6 程序集全局可用。
- 在命令提示符下,键入以下命令,然后按 Enter:
regasm MyComDll.dll /tlb:MyComDll.tlb
- 我们的 COM 类型库 (.tlb) 已创建,并可用于 VB6。
注意:“TlbExp.exe”是另一个可用于从 .NET 程序集生成 COM 类型库的实用程序,但它不会将其注册到 Windows 注册表中。
在 VB6 中使用我们新的 COM DLL
现在我们有了一个功能齐全的 COM DLL,可以用于 VB6。让我们进入 VB6 看看如何使用它。
创建新的 VB6 项目
- 启动 VB6。
- 当“新建项目”窗口打开时,选择“标准 EXE”。
- 单击“打开”按钮。
- 在窗体上添加一个按钮,然后双击它以创建 Click() 事件,并打开代码窗口。
添加对我们新的 COM DLL 的引用
- 单击“项目”菜单 |“引用…”。
- 在“可用引用:”列表框中,向下滚动直到找到我们新的库“MyComDemo”,然后勾选它。
- 单击“确定”按钮关闭“引用”窗口。
最后,在我们的命令按钮的 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 或“调试”菜单 |“单步执行”)。
- 单击窗体上的按钮。
这是我们测试的结果:

清理。
完成本文的学习后,您可能希望从注册表中删除我们创建的库。方法如下:
- 打开 Visual Studio 命令提示符。
- 导航到已编译的 .dll 所在的目录(bin\Release 文件夹)。
- 在命令提示符下,键入以下命令,然后按 Enter:
gacutil –u MyComDll.dll
结论
正如您所见,以手动方式创建 COM DLL,包括将其安装到 GAC 和注册到注册表,需要做更多的工作。
需要注意的一点是,如果您尝试将 COM DLL 安装到 GAC 并将其注册到注册表中,但使用的不是您自己的开发 PC,您可能会发现 gacutil 和 regasm 未安装。如果发生这种情况,您需要安装 .NET Framework Tools。此处有一个链接,其中提供了有关它们的更多信息: