我有一个用 C# 编写的 COM 可见 DLL,我想在 VB6 应用程序中使用它。我有两个主要的 DLL 用例,我想知道该/codebase
选项何时适用以及何时在 GAC 中注册更好。
用例:
Project > References
DLL 将被加载到另一台开发人员 PC 上,并且需要在菜单下可供 VB6 IDE 访问当 VB6 应用程序发布时,DLL 将被加载到生产机器上
任何有关适当使用的信息/codebase
都会有所帮助。
谢谢。
我有一个用 C# 编写的 COM 可见 DLL,我想在 VB6 应用程序中使用它。我有两个主要的 DLL 用例,我想知道该/codebase
选项何时适用以及何时在 GAC 中注册更好。
用例:
Project > References
DLL 将被加载到另一台开发人员 PC 上,并且需要在菜单下可供 VB6 IDE 访问
当 VB6 应用程序发布时,DLL 将被加载到生产机器上
任何有关适当使用的信息/codebase
都会有所帮助。
谢谢。
/codebase 选项与您使用 Regsvr32.exe 注册 COM 服务器的方式完全相同。您必须为 DLL 选择一个特定位置,并将该位置的路径写入注册表。这是有风险的,COM 服务器有一个强大的 DLL Hell 问题,因为它们的注册是机器范围的。当您更新该 DLL 时,任何使用该服务器的应用程序都会受到影响。这通常不是很好的方式,这经常会破坏未重新编译以使用更新的服务器的应用程序。
.NET 通过存储由 [AssemblyVersion] 选择的 DLL 的多个版本来改进这一点。与 Windows 并行缓存完全等效,即托管程序集的 GAC。因此,未重建的旧应用程序将继续不受影响地运行,仍然能够使用旧的 DLL。这是个好办法。
当您忙于开发服务器时,建议使用 /codebase。您可以跳过在 GAC 中注册 DLL 的额外必需步骤。忘记这样做很痛苦,您的更改似乎不起作用,因为测试应用程序将加载旧版本。当你使用 /codebase 时,Regasm 会显示一个警告,警告你 DLL Hell 的可能性,你可以忽略它。
当您让 Visual Studio 使用 Project > Properties > Build 选项卡进行注册时,“Register for COM interop”复选框将与 Regasm /codebase /tlb 完全相同。这样做更可取,因为它还确保旧版本的程序集被取消注册,从而避免注册表污染。但是 VS 必须运行提升才能写入注册表。
使用独立 COM(又名“免注册 COM”)是最好的方法。它使您可以将 COM 服务器的副本存储在与客户端程序相同的目录中,而您根本不必注册它。但是,这需要修改客户端程序,如果您对客户端应用程序没有任何控制权,或者如果它是其他人喜欢弄乱的那种应用程序,这很困难。例如 Microsoft Office 应用程序。