我有一个.NET DLL(碰巧是用C ++ / CLI编写的)。它的一部分我想通过COM公开。我这样做并使用“regasm my.dll / codebase”注册它。到现在为止还挺好。但后来我更改了一些东西和程序集更改的版本号加上我将dll移动到另一个文件夹。我再次注册它,并在OLE / COM查看器中查看我的COM对象。我看到这样的东西
InprocServer32 [Codebase] = file://c://foo/bar/my.dll 7.0.0.0 [Class] = My.Blah.Class 7.0.0.0 [Assembly] = Sync, Version=7.0.0.0, Culture=neutral, PublicKeyToken=1dd19234234 7.0.0.0 [RuntimeVersion] = v2.0.50727 7.0.0.0 [CodeBase] = file://c:/dooby/do/my.dll 7.0.0.27397 [Class] = My.Blah.Class 7.0.0.27397 [Assembly] = Sync, Version=7.0.0.27397, Culture=neutral, PublicKeyToken=1dd19234234 7.0.0.27397 [RuntimeVersion] = v2.0.50727 7.0.0.27397 [CodeBase] = file://c://foo/bar/my.dll
有关多个版本的问题:
所以我认为注册的最后一个COM对象获胜。如果我注册了旧的7.0.0.0 COM对象并不重要,7.0.0.27397是我在实例化COM对象时创建的,因为我最后注册了它。这是对的吗?
哎呀我没有留下7.0.0.0对象。有没有办法摆脱它?有没有办法删除所有版本的COM对象,而不是进入注册表并手动打击它?
出于好奇,如果我特意想要实例化我的COM对象的特定版本,有没有办法做到这一点? (如果你想给出代码示例,我正在使用C ++。)
有什么方法可以告诉我们没有存储版本号,因为它似乎让事情变得混乱,我看不出有什么好处。如果我的COM对象经历了重大的API更改,我只需更改GUID和progid,对吧?如果我不想注册多个版本(我没有),那该怎么办。
答案 0 :(得分:6)
出于这个原因,我总是使用静态AssemblyVersion设置我的COM可见组件。如果要使用版本标记二进制文件,请改用AssemblyFileVersion。
答案 1 :(得分:0)
具有相同CLSID的组件应该是兼容的,尤其是如果您只更改了程序集之间的内部版本号。这是我发现通过谷歌快速确认的唯一relevant事件。
直接回答您的问题: