4

在Visual Studio 包的IVsHierarchy接口中,有方法Unused0Unused1、和Unused2,描述如下:Unused3Unused4

Adds new methods without recompiling or breaking binary compatibility.

有人可以更详细地解释这一点。这些方法到底有什么帮助?

4

1 回答 1

6

Visual Studio 扩展对象在 COM 中实现。COM 中的一个硬性规则是接口是不可变的。更改接口需要重新分配接口 IID。标识接口的 guid。这会给使用该界面的任何人带来很多痛苦。他们将不得不改变他们的代码并重新编译它。

之所以存在这种不变性要求,是因为在底层 COM 接口是作为方法地址表实现的。当客户端代码假设的表与服务器实现的实际表不匹配时,灾难就会发生。或者换句话说,当接口不兼容二进制时。这会产生非常难以诊断的运行时错误,当客户端代码最终调用错误的方法或使用根本没有关联方法的表槽时触发。这就是臭名昭著的 COM DLL Hell 问题。更改 IID 解决了它,客户端代码将无法再找到旧的实现。仍然是一个令人讨厌的错误,但至少易于诊断。

占位符允许微软向界面添加新方法,但不会破坏表格布局。因此不必重命名接口并重新分配接口 IID。因此不会强制插件供应商重新编译他们的插件。除非新插件尝试使用旧接口实现,否则仍然无法正常工作。但是有可能得到一个体面的异常消息而不是一个讨厌的 AccessViolation。

于 2012-02-06T17:34:14.940 回答