- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
查看由 CCW 创建的生成的 TLB 文件,尽管 OLE/COM 对象查看器显示 IID 保持不变,除非我更改接口(interface)的设计(这是正确的行为),我担心的是,如果我在尽管接口(interface)没有改变,但另一台机器将生成完全不同的 IID,从而破坏现有的 COM 客户端。
最佳答案
类型的 guid 并非特定于 COM 互操作,所有 .NET 类型都有一个 guid。您可以从 Type.GUID 属性获取它。生成它的 CLR 中的代码可从 SSCLI20 发行版中获取。您可以通过查看 clr/scr/vm/methodtable.cpp MethodTable::GetGuid() 方法中的代码来了解该算法。
算法总结:
这些信息足以回答您的问题:
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/
我是一名优秀的程序员,十分优秀!