我有一个用 C# 编写的 DLL 并设置为 COM 可见性。我将它设置为并行程序集,并且可以成功地将应用程序部署到客户端 PC,无需注册。我的问题与开发PC有关。是否可以以类似的免注册方式针对 DLL 进行编译,或者是否需要在开发机器上进行注册?我尝试通过Project -> References
菜单直接添加 DLL,并收到一条错误消息,指出“无法添加对特定文件的引用”。该 DLL 与 .vbp 文件位于同一目录中,我尝试在存在和不存在客户端应用程序清单的情况下添加 DLL。
1 回答
我尝试通过 Project -> References 菜单直接添加 DLL
这添加了对类型库的引用。类型库是对 COM 组件中类型的独立于语言的描述,VB6 使用它来了解如何生成有效的代码并提供类型检查和自动完成功能。类型库与 .NET 程序集中的元数据完全等效。
传统上,和 VB6 一样,类型库作为资源嵌入到 DLL 中。因此,您可能习惯于在对话框中选择 DLL。然而,当 DLL 是由 C# 生成时,这并不能很好地工作,类型库只能在 C# 代码编译后生成。您必须在 VB6 对话框中选择 .tlb 文件。传统的方式是从用 IDL 语言描述的 COM 组件开始,可以在编译代码之前生成类型库,因此可以很容易地嵌入到最终的 DLL 中。在技术上也可以在 C# 中完成,但是构建步骤非常费力和痛苦,您基本上必须使用不同的构建命令构建 DLL 两次。
C# 库的类型库通常通过以下三种方式之一生成:
- 使用 Project + Properties,Build 选项卡,“Register for COM interop”选项。这需要 VS 运行提升,以便它可以写入注册表。您可以通过右键单击其快捷方式并选择“以管理员身份运行”来启动 VS
- 通过运行 Regasm.exe,使用 /tlb:filename 选项。如果您出于某种原因不想运行 VS 提升,则第一个项目符号的替代方法是必要的。在您的开发机器上使用 /codebase 选项也是明智的,使其与第一个项目符号完全相同,并且不需要使用 gacutil.exe 将 DLL 放入 GAC
- 通过运行 Tlbexp.exe 实用程序,.NET 程序集的类型库导出器。没有注册,它只生成 .tlb 文件。
第一个项目符号是正常的选择并且非常可取,因为您永远不会忘记以这种方式更新类型库。这在开发机器上非常好,因为您只关心用户机器上的无注册部署。如果不再这样做,您可能会遇到麻烦。
使用第三个选项是可以的,并且更符合您的目标,从 Visual Studio 命令提示符运行Tlbexp 。请记住,当您对 C# 代码进行更改时,您必须再次执行此操作。忘记这一点并失去一团头发试图弄清楚为什么您的 C# 更改似乎没有效果或获得难以诊断的错误代码给您很多理由再次考虑第一个项目符号 :) 您可以效仿通过运行带有 /uninstall 选项的 Regasm.exe 来实现无 reg 方案。