gpt4 book ai didi

.net - .NET COM Callable Wrapper 如何生成 IID?

转载 作者:行者123 更新时间:2023-12-03 07:21:49 27 4
gpt4 key购买 nike

查看由 CCW 创建的生成的 TLB 文件,尽管 OLE/COM 对象查看器显示 IID 保持不变,除非我更改接口(interface)的设计(这是正确的行为),我担心的是,如果我在尽管接口(interface)没有改变,但另一台机器将生成完全不同的 IID,从而破坏现有的 COM 客户端。

  1. COM 可调用包装器如何生成 COM 接口(interface) ID?
  2. CCW 如何知道接口(interface)是否已更改并需要生成新的 IID?
  3. 直接生成我自己的并在源文件中声明会更安全吗?

最佳答案

类型的 guid 并非特定于 COM 互操作,所有 .NET 类型都有一个 guid。您可以从 Type.GUID 属性获取它。生成它的 CLR 中的代码可从 SSCLI20 发行版中获取。您可以通过查看 clr/scr/vm/methodtable.cpp MethodTable::GetGuid() 方法中的代码来了解该算法。

算法总结:

  • 如果类型具有 [Guid] 属性,则返回该属性
  • 如果类型是接口(interface)类型,则生成接口(interface)类型定义的字符串化版本。这是由 interoputil.cpp 中的 GetStringizedItfDef() 完成的。它以完全限定的类型名称开头,并附加每个成员定义的字符串版本。
  • 对于所有其他类型,生成该类的字符串化版本。它以完全限定的类型名称开头,附加类名称并附加完全限定的程序集名称。
  • 然后通过辅助函数 CorGuidFromNameW() 将生成的字符串哈希为 Guid。

这些信息足以回答您的问题:

How are the COM Interface IDs generated by the COM Callable Wrapper?

它使用通过上述算法生成的 Type.GUID。算法中的所有元素都不是特定于执行该算法的机器的,因此您不必担心在不同的构建机器上获得不同的 IID 和 CLSID。

How does the CCW know if the interface has changed and needs to generate a new IID?

事实并非如此。它完全依赖于为不同接口(interface)定义生成不同 GUID 的算法。

Would it be safer to just generate my own and declare in the source file?

不是真的。该算法没有记录的故障模式。使用您自己的 [Guid] 属性会显着增加您在必要时忘记更改它的可能性。这是一个经常使用的快捷方式,也是 DLL Hell 的主要来源。令人讨厌的那种,会让客户端崩溃并且几乎无法诊断硬件异常的那种。与仍然困难但并非不可能的 E_NOINTERFACE 相反。我能想到的依靠自动生成的 Guid 确实只有两个缺点:当您忘记在重建程序集之前取消注册程序集时,它往往会导致开发计算机上的注册表污染。当您排除 COM 错误时,它会降低您的速度,因为您不太了解这些指南。诚然,注册表污染对我来说已经是足够的理由了。

关于.net - .NET COM Callable Wrapper 如何生成 IID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6563714/

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