VB6针对并排汇编进行编译

时间:2014-06-03 21:23:45

标签: com vb6 com-interop side-by-side regfreecom

我有一个用C#编写的DLL,并设置为COM可见性。我将它设置为并排组件,并且可以将应用程序成功部署到客户端PC免费注册。我的问题与开发PC有关。是否可以在类似的免注册庄园中针对DLL进行编译,或者是否需要在开发机器上进行注册?我尝试通过Project -> References菜单直接添加DLL并收到错误说明"无法添加对特定文件的引用。" DLL与.vbp文件位于同一目录中,我尝试在存在和不存在客户端应用程序清单的情况下添加DLL。

1 个答案:

答案 0 :(得分:5)

  

我尝试通过Project直接添加DLL - >参考菜单

这会添加对类型库的引用。类型库是COM组件中类型的独立于语言的描述,VB6使用它来了解如何生成高效代码并提供类型检查和自动完成。类型库与.NET程序集中的元数据完全等效。

传统上,和VB6一样,类型库作为资源嵌入到DLL中。所以你可能习惯于在对话框中选择一个DLL。但是,当C#生成DLL时,这种方法效果不佳,只能在编译C#代码后生成类型库。您必须在VB6对话框中选择.tlb文件。传统方式从IDL语言中描述的COM组件开始,类型库可以在编译代码之前生成,因此可以很容易地嵌入到最终的DLL中。技术上也可以在C#中完成,但是构建步骤非常费力且非常痛苦,你必须使用不同的构建命令构建DLL两次。

C#库的类型库通常以三种方式之一生成:

  • 使用Project + Properties,Build选项卡,"注册COM互操作"选项。这需要VS运行提升,以便它可以写入注册表。右键单击其快捷方式并选择"以管理员身份运行"
  • ,即可启动VS
  • 使用/ tlb:filename选项运行Regasm.exe。第一个子弹的替代方案,如果您因某些原因不希望运行VS,则必须使用。使用dev机器上的/ codebase选项也是明智的,使它的工作方式与第1个子弹完全相同,不需要使用gacutil.exe将DLL放入GAC
  • 通过运行Tlbexp.exe实用程序,.NET程序集的类型库导出程序。没有注册,它只生成.tlb文件。

第一个项目符号是正常选择,非常是可取的,因为您永远不会忘记以这种方式更新类型库。在开发机器上完全没问题,因为您只关心用户机器上的无法部署。你可能因为不再这样做而陷入困境。

使用第三种选择是可以的,并且与您的目标更加兼容,请从Visual Studio命令提示符运行Tlbexp。请记住,当您更改C#代码时,必须再次执行此操作。忘掉这一次并丢失头发,试图弄清楚为什么你的C#改变似乎没有效果或难以诊断错误代码让你有很多理由再次考虑第一颗子弹:)你可以通过使用/ uninstall选项运行Regasm.exe来模拟无reg方案。