.NET/COM如何处理通过Regasm注册的多个版本?

.NET/COM如何处理通过Regasm注册的多个版本?,com,versions,regasm,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.Cl

我有一个.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 InprocServer32[Codebase]=file://c://foo/bar/my.dll 7.0.0.0[Class]=My.Blah.Class 7.0.0.0[Assembly]=Sync,版本=7.0.0.0,区域性=neutral,PublicKeyToken=1dd19234234 7.0.0.0[运行时版本]=v2.0.50727 7.0.0.0[CodeBase]=file://c:/dooby/do/my.dll 7.0.0.27397[类]=我的类 7.0.0.27397[程序集]=同步,版本=7.0.0.27397,区域性=中性,PublicKeyToken=1dd19234234 7.0.0.27397[运行时版本]=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对象的所有版本吗

  • 出于好奇,如果我特别想实例化我的COM对象的特定版本,有什么方法可以做到这一点吗?(如果你想给出一个代码例子,我使用C++)。< /P>
  • 我有没有办法告诉regasm不要存储版本号,因为它似乎把事情搞得一团糟,我看不出有什么好处。如果我的COM对象经历了重大的API更改,我只需要更改GUID和progid,对吗?如果我不想注册多个版本(我不想)


  • 具有相同CLSID的组件应该是兼容的,特别是如果您只更改了程序集之间的内部版本号。这是我通过谷歌搜索找到的唯一能证实这一点的东西

    要直接回答您的问题:

  • 重新注册/注销
  • 调查
  • 可能不会

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

  • 最后注册的对象:是
  • 不是真的。您可以将内容放入程序集的ComRegisterFunction/ComUnregisterFunction属性化方法中以自动化清理,但如果您保留旧版本的删除,这大概是唯一的方法
  • 您可以使用不同的coclass GUID和/或ProgID(例如myClass.1、.2等)来实现。CoCreateInstance对版本值一无所知——CLR的激活器使用这些值来确保它加载了正确的程序集
  • 否-最好不要更改程序集版本(参见上文)
    我发现有证据表明COM总是选择注册了多个版本的组件的编号最高的版本,而不是最后注册的版本。有人能证实这一点吗?