gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:15:02 27 4
gpt4 key购买 nike

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

InprocServer32 [代码库] = file://c://foo/bar/my.dll
7.0.0.0 [Class] = My.Blah.Class
7.0.0.0 [Assembly] = 同步,版本=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 [Class] = 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,对吗?如果我不想注册多个版本怎么办(我不想)。
  • 最佳答案

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

  • 最后注册的对象获胜:是的
  • 并不真地。您可以将内容放入程序集的 ComRegisterFunction/ComUnregisterFunction 属性方法中以自动清理,但如果您留下旧版本的垃圾,这是唯一的方法。
  • 您可以使用不同的 coclass GUID 和/或 ProgID(例如,MyCoClass.1、.2 等)来执行此操作。 CoCreateInstance 对版本值一无所知——CLR 的激活器使用它们来确保它加载了正确的程序集。
  • 不 - 最好的办法是永远不要更改您的程序集版本(见上文)。
  • 关于com - .NET/COM 如何处理通过 Regasm 注册的多个版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1718641/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com