7

我有一个 .NET DLL(恰好是用 C++/CLI 编写的)。我想通过 COM 公开其中的一部分。我这样做并使用“regasm my.dll /codebase”注册它。到现在为止还挺好。但后来我改变了一些东西,程序集的版本号也改变了,而且我把 dll 移到了另一个文件夹。我再次注册它并在 OLE/COM 查看器中查看我的 COM 对象。我看到这样的东西

InprocServer32 [代码库] = file://c://foo/bar/my.dll
7.0.0.0 [类] = My.Blah.Class
7.0.0.0 [程序集] = 同步,版本 = 7.0.0.0,文化 = 中性,PublicKeyToken = 1dd19234234
7.0.0.0 [运行时版本] = v2.0.50727
7.0.0.0 [代码库] = file://c:/dooby/do/my.dll
7.0.0.27397 [类] = My.Blah.Class
7.0.0.27397 [程序集] = 同步,版本 = 7.0.0.27397,文化 = 中性,PublicKeyToken = 1dd19234234
7.0.0.27397 [运行时版本] = v2.0.50727
7.0.0.27397 [代码库] = 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,对吗?如果我不想注册多个版本怎么办(我不想)。

4

2 回答 2

6

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

  1. 最后注册的对象获胜:是的
  2. 并不真地。您可以将内容放入程序集的 ComRegisterFunction/ComUnregisterFunction 属性方法中以自动进行清理,但如果您留下旧版本的粪便,这是唯一的方法。
  3. 您可以使用不同的 coclass GUID 和/或 ProgID(例如,MyCoClass.1、.2 等)。CoCreateInstance 对版本值一无所知——CLR 的激活器使用它们来确保它加载了正确的程序集。
  4. 最好的办法是永远不要更改您的程序集版本(见上文)。
于 2009-11-11T23:02:42.303 回答
0

具有相同 CLSID 的组件应该是兼容的,特别是如果您只更改了程序集之间的内部版本号。这是我发现的唯一相关的事情,可以通过快速谷歌搜索来确认这一点。

直接回答您的问题:

  1. 正确的。
  2. regasm /注销
  3. 查看绑定重定向
  4. 可能不是。
于 2009-11-11T23:01:42.210 回答