.net - Visual Studio 扩展接口(interface)中未使用的方法

标签 .net visual-studio com visual-studio-extensions

IVsHierarchy Visual Studio 包的接口(interface),有方法Unused0 , Unused1 , Unused2 , Unused3Unused4带有以下描述:

Adds new methods without recompiling or breaking binary compatibility.

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

最佳答案

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

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

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

关于.net - Visual Studio 扩展接口(interface)中未使用的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9160434/

相关文章:

c# - 为扩展方法创建特定于硬件的委托(delegate)

c++ - 指向 boost 共享指针 vector 的空指针

c++ - 使用带有 BSTR* 参数的 COM-DLL --> Float Div By Zero 错误

c# - 搜索换行符 C#.net

c# - 由于 SecurityException 无法读取事件日志

macos - 在 Visual Studio for Mac 中设置多个启动项目?

.net - Wix !(bind.AssemblyFullName.fileId) 仅适用于 GACed 程序集?

c++ - "Set"C++中批量COM对象属性

c# - 需要一个 .NET WinForms IP 地址控件

visual-studio - 不编译 t4 文件