.NET / COM如何与通过Regasm注册的多个版本一起使用?

时间:2009-11-11 22:48:59

标签: com versions regasm

我有一个.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

有关多个版本的问题:

  1. 所以我认为注册的最后一个COM对象获胜。如果我注册了旧的7.0.0.0 COM对象并不重要,7.0.0.27397是我在实例化COM对象时创建的,因为我最后注册了它。这是对的吗?

  2. 哎呀我没有留下7.0.0.0对象。有没有办法摆脱它?有没有办法删除所有版本的COM对象,而不是进入注册表并手动打击它?

  3. 出于好奇,如果我特意想要实例化我的COM对象的特定版本,有没有办法做到这一点? (如果你想给出代码示例,我正在使用C ++。)

  4. 有什么方法可以告诉我们没有存储版本号,因为它似乎让事情变得混乱,我看不出有什么好处。如果我的COM对象经历了重大的API更改,我只需更改GUID和progid,对吧?如果我不想注册多个版本(我没有),那该怎么办。

2 个答案:

答案 0 :(得分:6)

出于这个原因,我总是使用静态AssemblyVersion设置我的COM可见组件。如果要使用版本标记二进制文件,请改用AssemblyFileVersion。

  1. 最后注册的对象获胜:是的
  2. 不是。你可以把东西放在你的程序集的ComRegisterFunction / ComUnregisterFunction属性方法中来自动清理,但如果你留下旧版本的粪便,这是唯一的方法。
  3. 您可以使用不同的coclass GUID和/或ProgID(例如,MyCoClass.1,.2等)。 CoCreateInstance对版本值一无所知 - 它们被CLR的激活器用来确保它加载了正确的组件。
  4. 不 - 最好的办法是永远不要改变你的装配版本(见上文)。

答案 1 :(得分:0)

具有相同CLSID的组件应该是兼容的,尤其是如果您只更改了程序集之间的内部版本号。这是我发现通过谷歌快速确认的唯一relevant事件。

直接回答您的问题:

  1. 正确。
  2. regasm / unregister
  3. 查看Binding redirects
  4. 可能不是。