2010-05-26 4 views
4

В дневной работе я работаю над VB6 (я знаю, но не издеваюсь над огорченным ...) приложением, которое использует несколько библиотек, которые мы написали (также в вездесущем VB6). Одна из этих поддерживающих библиотек имела нагрузку частных членов, открытых через публичные свойства, и меня попросили удалить свойства и продвинуть частные переменные-члены в общедоступные поля с тем же именем, что и исходные свойства.COM-интерфейсы и двоичная совместимость

Теперь я не эксперт по COM, но у меня создалось впечатление, что каждый открытый объект в классе получает свой собственный идентификатор GUID. Поскольку мы переходим от ситуации, когда каждое значение перешло от 2 Guids (Property Get и Property Let) к одному, в котором они использовали только одно (публичное поле), я ожидал, что это нарушит совместимость с двоичными файлами - но похоже, что hasn Это сделано.

Может ли кто-нибудь объяснить, почему?

+1

более того, почему вы хотите заменить свойства публичными полями? –

+0

Потому что у меня были твердые инструкции, чтобы сделать это из моего технического руководства ... Помните, что я сказал о том, чтобы не издеваться над страдающим LOL? Я отказался от разума - это крестовый поход ... –

ответ

2

Я думаю, что это немного более тонко, чем это. Вы получаете GUID для интерфейса COM (не каждое отдельное поле/метод). Насколько я понимаю, двоичная совместимость пытается работать, если интерфейс, который вы компилируете в настоящий момент, обратно совместим с эталонной версией вашей DLL (если у вас есть) и только изменяет идентификатор GUID, если они несовместимы.

Я поэтому и удивлен тем, что он решил, удалив все методы получения/установки совместят:/

+0

Спасибо за это ... Я думал, что GUID был проведен по методу (прошло некоторое время с тех пор, как я запутался в нем - последний раз при работе над ним некоторые COM-Interop от VB2005 несколько лет назад ...). Вы правы, хотя. Да, я удивлен, что оказалось, что оно совместимо ... –

+0

Совместим, потому что он ** не удалил ** методы get/set. См. Мой ответ для более подробной информации. – MarkJ

6

Нет, это не имеет сломанную совместимость, потому что не имеет удалено свойство получить и методы let. Просто компилятор теперь пишет их для вас.

Разве это не одна из немногих областей, где VB6, возможно, лучше чем .Net?

  • В публичных полях .Net поведение по-разному относится к публичным объектам, и это makes some refactorings difficult and causes confusion.
  • В публичных полях VB6 ведут себя точно так же, как и общедоступные свойства, поэтому можно переключаться без ущерба для двоичной совместимости. За кулисами компилятор generates получает и устанавливает процедуры для открытых полей. В некотором смысле VB6 автоматически реализовал свойства (теперь advertised в качестве «новой функции» в VB10) ...
+0

Интересно ... Спасибо за это ... –

 Смежные вопросы

  • Нет связанных вопросов^_^