我有将被多个项目使用的公共库。我已经签署了强大的名称,以管理整个项目的多个版本。在这个库中,我有几个类具有[comvisible (true)]属性。然而,我不想为COM互操作注册这个库。但我得到编译错误,要求我"请注册您的COm互操作程序集"。
我是。net中COM的新手。我假设只有当我有[ComRegisterFunction]在我的库中,我需要注册它为COM互操作。如果我说错了请指正。
如果我在COM Interop中注册它,那么强命名将无助于在整个项目中维护多个版本。
但是,我不想为COM互操作注册这个库。
你必须注册它,这是客户端程序找到你的DLL的方式。客户端代码在创建对象时使用一个数字(CLSID guid),注册表告诉哪个DLL实现了这个数字。从技术上讲,客户端程序可以使用清单和它自己的本地DLL副本,但这不在你的控制之下。
我假设只有当我有[ComRegisterFunction]在我的库,
很少需要。只有在Regasm.exe写入标准注册表项之外需要写入其他注册表项时才需要。它不以任何方式解决版本问题。
那么强命名将没有帮助
强名称允许您将程序集放在GAC中。实际上是有帮助的,它避免了新版本的DLL文件覆盖旧版本,并确保未重新编译的旧客户端程序仍然可以找到旧版本的DLL。这不是唯一的技术,您还可以给新版本的DLL一个不同的文件名,这样它们就可以一起存放在一个目录中,而不会相互覆盖。这并不是一种非常可靠的方法,当程序员不得不与构建系统作斗争时,他们倾向于走捷径。这是一条非常危险的捷径。无论如何,GAC是经常需要的,CLR在定位相关程序集时会遇到麻烦。
请记住,GAC只解决了与COM相关的DLL地狱问题中的一个。COM中另一个非常重要的规则是接口和类是不可变的。如果您更改了其中一个,那么必须给它们一个不同的数字。这确保了客户端程序不会意外地创建不兼容的对象。非常重要的是,当客户端程序使用早期绑定时,版本控制问题非常难以诊断。如果你没有在[ComVisible]类型上显式地使用[Guid]属性,那么在。net中获取不同的数字是自动的。