但是,我不想为 COM 互操作注册这个库。
您必须注册它,这是客户端程序找到您的 DLL 的方式。客户端代码在创建对象时使用一个数字(CLSID guid),注册表告诉哪个 DLL 实现了该数字。从技术上讲,客户端程序可以使用清单及其自己的 DLL 本地副本,但这不受您的控制。
我假设只有当我的库中有 [ComRegisterFunction] 时,
很少需要。仅当需要在 Regasm.exe 写入的标准注册表项之外编写其他注册表项时才需要。它不以任何方式解决版本控制问题。
那么强命名将无济于事
强名称允许您将程序集放入 GAC。这实际上很有帮助,它避免了新版本的 DLL 文件覆盖旧版本,并确保未重新编译的旧客户端程序仍然可以找到旧版本的 DLL。这不是唯一的技术,您还可以为 DLL 的新版本赋予不同的文件名,这样它们就可以一起存在于单个目录中而不会相互覆盖。这不是一个非常可靠的方法,程序员在必须与构建系统作斗争时倾向于走捷径。这是一条非常危险的捷径。无论如何,通常都需要 GAC,CLR 将无法找到相关程序集。
请记住,GAC 仅解决与 COM 相关的 DLL Hell 问题之一。COM 中另一个非常重要的规则是接口和 coclass 是不可变的。如果您对其中一个进行更改,那么您必须给他们一个不同的号码。这确保了客户端程序不会意外创建不兼容的对象。非常重要的是,当客户端程序使用早期绑定时,版本控制问题非常难以诊断。如果您没有在 [ComVisible] 类型上显式使用 [Guid] 属性,则在 .NET 中会自动获取不同的数字。