我有一个 .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
关于多个版本的问题:
所以我认为最后一个注册的 COM 对象获胜。如果我注册了旧的 7.0.0.0 COM 对象并不重要,7.0.0.27397 是我实例化 COM 对象时将创建的对象,因为我是最后注册的。那是对的吗?
糟糕,我没有保留 7.0.0.0 对象。有没有办法摆脱它?除了进入注册表并手动敲击它之外,还有什么方法可以删除 COM 对象的所有版本?
只是出于好奇,如果我特别想实例化我的 COM 对象的特定版本,有没有办法做到这一点?(如果你想给出一个代码示例,我正在使用 C++)。
有什么办法可以告诉 regasm 不要存储版本号,因为它似乎把事情弄得一团糟,我看不出有什么好处。如果我的 COM 对象经历了重大的 API 更改,我只需更改 GUID 和 progid,对吗?如果我不想注册多个版本怎么办(我不想)。