RegAsm - / codebase选项何时适用?

时间:2014-05-29 17:50:11

标签: dll com vb6 regasm comvisible

我有一个用C#编写的COM可见DLL,我想在VB6应用程序中使用它。我有两个DLL的主要用例,我想知道/codebase选项何时适用以及何时最好在GAC注册。


用例:

  1. DLL将被加载到另一台开发者PC上,并且需要在Project > References菜单

  2. 下的VB6 IDE中访问
  3. 当VB6应用程序发布时,DLL将被加载到生产机器上


  4. 有关正确使用/codebase的任何信息都会有所帮助。

    感谢。

1 个答案:

答案 0 :(得分:26)

/ codebase选项与您使用Regsvr32.exe注册COM服务器的方式完全等效。您必须为DLL选择一个特定位置,并将该位置的路径写入注册表。这是冒险,COM服务器具有强大的DLL Hell问题,因为它们的注册是在整个计算机范围内进行的。当您更新该DLL时,使用该服务器的任何应用程序将受到影响。通常并不是很好,这经常打破一个未重新编译的应用程序以使用更新的服务器。

.NET通过能够存储由[AssemblyVersion]选择的DLL的多个版本来改进。 Windows并行缓存的完全等价物,即托管程序集的GAC。因此,未重建的旧应用程序将继续不受影响地运行,仍然可以使用旧的DLL。这是一个好方法。

当您忙于开发服务器时,建议使用/ codebase。您可以跳过在GAC中注册DLL的额外必需步骤。忘记这样做很痛苦,您的更改似乎无法正常工作,因为测试应用程序将加载旧版本。当你使用/ codebase时,Regasm会显示一个警告,警告你关于DLL Hell的潜力,你可以忽略它。

当您让Visual Studio负责项目的注册时>属性>构建选项卡,"注册COM互操作"复选框然后你得到Regasm / codebase / tlb的确切等价物。这样做更为可取,因为它还确保了旧版本的程序集未注册,从而避免了注册表污染。但VS必须升级才能写入注册表。

使用隔离的COM(又名"无注册表的COM")是最好的方法。它允许您将COM服务器的副本存储在与客户端程序相同的目录中,并且您根本不必注册它。然而,这需要修改客户端程序,如果您对客户端应用程序没有任何控制权,或者是其他人喜欢混淆的那种应用程序,则很难。例如,Microsoft Office应用程序。