首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COM互操作和ComVisible注册(真)

COM互操作和ComVisible注册(真)
EN

Stack Overflow用户
提问于 2014-07-08 14:40:51
回答 1查看 311关注 0票数 0

我有一个公共库,它将被多个项目使用。为了管理整个项目的多个版本,我已经用强名称签名了它。在这个库中,我有两个带有ComVisble(true)属性的类。但是,我不想为COM互操作注册这个库。但我得到编译错误,要求我“请注册您的程序集为COm互操作”。

我对.Net的COM很陌生。我假设只有当我的库中有ComRegisterFunction时,我才需要为COM互操作注册它。如果我错了,请纠正我。

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

如果能在这方面提供任何帮助,我们将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-08 16:00:16

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

您必须注册它,这是客户端程序查找DLL的方式。客户端代码在创建对象( CLSID )时使用数字,注册表将通知实现该编号的DLL。从技术上讲,客户端程序可以使用清单和它自己的DLL的本地副本,但这不在您的控制范围之内。

我假设只有当我的图书馆里有ComRegisterFunction时,

这是很少需要的。只有在需要编写超出Regasm.exe编写的标准注册表项的额外注册表项时,才有必要。它根本不解决版本控制问题。

那么强命名就不会有帮助了。

强名称允许您将程序集放在GAC中。这实际上是有帮助的,它避免了新版本的DLL文件覆盖旧版本,并确保没有重新编译的旧客户端程序仍然可以找到您的DLL的旧版本。这不是唯一的技术,您还可以为DLL的新版本提供不同的文件名,这样它们就可以一起驻留在一个目录中,而无需相互覆盖。这并不是一种非常可靠的方法,程序员在与构建系统搏斗时往往会走捷径。这是一条非常危险的捷径。GAC通常是需要的,CLR将很难找到依赖的程序集。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24634735

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档