为什么公共字段和属性可以互换二进制兼容?

Mar*_*lan 5 vb6 com guid binary-compatibility

在白天的工作中,我使用VB6(我知道,但不要模拟受影响的......)应用程序,它使用了我们编写的许多库(也是在着名的VB6中).其中一个支持库有大量私有成员通过公共属性公开,我被要求删除属性,并将私有成员变量提升到与原始属性同名的公共字段.

现在,我不是COM专家,但我的印象是,类中的每个暴露项都获得了它自己的GUID.因为我们将从每个值从2个Guids(Property Get和Property Let)变为仅使用一个(公共字段)的情况开始,我期望这会破坏二进制兼容性 - 但它似乎没有做到了.

有谁能解释为什么?

Mar*_*rkJ 6

不,它没有破坏兼容性,因为它没有删除属性get和property let方法.只是编译器正在为您编写它们.

这不是VB6可以说比.Net 更好的少数领域之一吗?

  • 在.Net公共字段中对公共属性的行为不同,这使得一些重构变得困难并导致混淆.
  • 在VB6中,公共字段的行为与公共属性完全相同,这就是为什么可以在不影响二进制兼容性的情况下进行切换的原因.在幕后,编译器为公共字段生成属性get和set例程.从某种意义上说,VB6已经自动实现了属性(现在在VB10中被宣传为"新功能")......


Pao*_*olo 1

我认为这比这更微妙。您将获得 COM 接口的 GUID(不是每个单独的字段/方法)。据我了解,二进制兼容性尝试确定当前编译的接口是否向后兼容 DLL 的参考版本(假设您有一个),并且仅在不兼容时才更改 GUID。

因此,我也很惊讶它决定删除所有兼容的 get/set 方法:/