注册COM Interop和ComVisible(true)

时间:2014-07-08 14:40:52

标签: com interop registration comvisible

我有一个将由多个项目使用的公共库。我已经使用强名称签名,以便管理整个项目的多个版本。在这个库中,我有几个类与[ComVisble(true)]属性。但是,我不想为COM互操作注册此库。但是我收到编译错误,要求我#34;请注册你的程序集为COm Interop"。

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

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

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

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

  

然后强命名将没有帮助

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

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