【问题标题】:RegAsm - When is the /codebase option applicable?RegAsm - /codebase 选项何时适用?
【发布时间】:2014-07-19 08:01:13
【问题描述】:

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


用例:

  1. DLL 将被加载到另一台开发人员 PC 上,并且需要在 Project > References 菜单下可供 VB6 IDE 访问

  2. 当 VB6 应用程序发布时,DLL 将被加载到生产机器上


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

谢谢。

【问题讨论】:

  • 您的意思是 GAC 而不是 DOM
  • /codebase 参数不会影响注册per-se,或 VB6 或其他任何人如何查看对象。它的唯一作用是确定当 VB6(或其他任何人)实际尝试使用 DLL 时 .NET 将在何处查找 DLL。我已经看到了 GAC 和 /codebase 的论点。 Microsoft 似乎建议将 GAC 用于生产,将 /codebase 用于开发。这里其他受人尊敬的用户似乎总是提倡 /codebase。我倾向于遵循前者。这主要是一个易于部署的问题,而不是如何针对它进行编码或执行的问题。
  • 我的意思是 GAC。感谢指正,我已经更新了原帖。
  • @EuroMicelli 您能否列出一些论点或向我指出一些资源?我有兴趣阅读有关该主题的更多信息。
  • 选择@Hans 的回答。他的比我写的要好。

标签: dll com vb6 regasm comvisible


【解决方案1】:

/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 应用程序。

【讨论】:

  • 我是否理解正确;您会建议开发人员使用/codebase 选项,以确保他们始终针对最新副本运行,但生产环境针对 GAC 运行,以防止旧应用程序在新版本发布后未更新的问题?
  • 它是这么说的,是的。
  • 将 COM 服务器 DLL 与应用程序存储在同一文件夹中是有风险的,因为相当多的客户端会调用 selfreg 入口点,这可能导致最常见的 DLL Hell 源占据上风。即使使用 SxS 清单,使用 app 文件夹的 bin 等子文件夹也要安全得多。
  • 不,这绝对不是客户端程序应该做的。没有意义,COM 服务器已注册,因此客户端可以找到 DLL。无论如何,UAC 都会阻止它。
  • @HansPassant 我同意注册解决方案是最好的。你知道以这种方式设置我的 DLL 的任何好的资源吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 1970-01-01
相关资源
最近更新 更多