0

我有多个项目将使用的公共库。我已经用强名称对其进行了签名,以便管理整个项目的多个版本。在这个库中,我有几个具有 [ComVisble(true)] 属性的类。但是,我不想为 COM 互操作注册这个库。但我收到编译错误,要求我“请为 COM Interop 注册您的程序集”。

我是 .Net 中的 COM 新手。我假设只有当我的库中有 [ComRegisterFunction] 时,我才需要为 COM 互操作注册它。如果我错了,请纠正我。

如果我使用 COM Interop 注册它,那么强命名将无助于维护整个项目的多个版本。

对此的任何帮助将不胜感激。

4

1 回答 1

0

但是,我不想为 COM 互操作注册这个库。

您必须注册它,这是客户端程序找到您的 DLL 的方式。客户端代码在创建对象时使用一个数字(CLSID guid),注册表告诉哪个 DLL 实现了该数字。从技术上讲,客户端程序可以使用清单及其自己的 DLL 本地副本,但这不受您的控制。

我假设只有当我的库中有 [ComRegisterFunction] 时,

很少需要。仅当需要在 Regasm.exe 写入的标准注册表项之外编写其他注册表项时才需要。它不以任何方式解决版本控制问题。

那么强命名将无济于事

强名称允许您将程序集放入 GAC。这实际上很有帮助,它避免了新版本的 DLL 文件覆盖旧版本,并确保未重新编译的旧客户端程序仍然可以找到旧版本的 DLL。这不是唯一的技术,您还可以为 DLL 的新版本赋予不同的文件名,这样它们就可以一起存在于单个目录中而不会相互覆盖。这不是一个非常可靠的方法,程序员在必须与构建系统作斗争时倾向于走捷径。这是一条非常危险的捷径。无论如何,通常都需要 GAC,CLR 将无法找到相关程序集。

请记住,GAC 仅解决与 COM 相关的 DLL Hell 问题之一。COM 中另一个非常重要的规则是接口和 coclass 是不可变的。如果您对其中一个进行更改,那么您必须给他们一个不同的号码。这确保了客户端程序不会意外创建不兼容的对象。非常重要的是,当客户端程序使用早期绑定时,版本控制问题非常难以诊断。如果您没有在 [ComVisible] 类型上显式使用 [Guid] 属性,则在 .NET 中会自动获取不同的数字。

于 2014-07-08T16:00:16.143 回答