我已经google了很多,发现很奇怪,没有人愿意解释为什么COM接口是不可变的。我想你无法从COM接口中删除任何方法的原因是因为依赖于该接口的客户端会遇到错误,这是不好的。但是为什么在接口上添加新功能会改变其中的任何一个?这与底层的vtable有关吗?
答案 0 :(得分:5)
COM有一个非常强大的DLL Hell问题。几个基本原因:
这些是其他通用的版本控制问题,许多运行时实现都会受到各种痛苦的影响。 COM的一个特定优势是你可以做些什么。改变{guids}并消除许多肮脏的东西。
答案 1 :(得分:3)
如果添加方法,则在使用旧版本的组件时,使用该方法的较新客户端将失败。
除非您专门添加代码来实现它,重建组件,然后在使用该组件的所有计算机上重新安装组件,否则组件的旧版本将无法使用新方法。
如果较新版本的客户端尝试在没有该方法的旧版本组件上调用新方法,则会发生未定义的行为(可能是崩溃,但也可能是静默数据损坏)。新客户端将尝试通过vtable中的指针条目调用方法,该指针条目在构建旧客户端时不存在,因此旧客户端在此位置将具有一些不相关的值。
当然,如果您同时控制客户端和组件并将它们部署在一起,这对您来说不会是一个问题,但COM是针对更广泛的用例而设计的。