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

mhe*_*384 7 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. 有什么方法我可以告诉regasm不存储版本号,因为它似乎是混乱的东西,我看不出有什么好处.如果我的COM对象经历了重大的API更改,我只需更改GUID和progid,对吧?如果我不想注册多个版本(我没有),该怎么办?

nit*_*one 6

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

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