Бинарная совместимость VB6 - добавление новых событий

В exe-проекте VB6 ActiveX есть ли способ сохранить GUID для интерфейса событий, если и когда будут добавлены новые события?

Очевидно, что изменение существующих событий нарушает совместимость. Добавление нового не заставляет VB6 IDE выдавать предупреждение. Это, на самом деле, меня не удивляет, так как не предупреждает при добавлении новых методов, но, по крайней мере, существующие методы сохраняют свои GUID.

С событиями, кажется, нет никакого способа сохранить обратную совместимость для существующих, если новые будут добавлены позже.

Это не проблема для приложений VB6, интегрирующихся через COM; Я предполагаю, что среда выполнения VB делает что-то умное, чтобы обнаружить события через реестр, без необходимости заранее знать GUID.

Если другое приложение -.Net (в частности, C#), и я должен объявить интерфейс вручную, чтобы реализовать приемники событий, я хочу, чтобы GUID оставался постоянным, чтобы избежать необходимости перекодирования i/f всякий раз, когда VB6 приложение расширено Я не могу ни знать, ни заботиться о недавно реализованных событиях в приложении VB6 - я просто хочу иметь возможность продолжать использовать уже существующие без необходимости изменять исходный код.Net.

Есть ли какой-то трюк с VB6, который мне не хватает, который позволил бы мне это сделать?

3 ответа

Проблема в том, что после определения COM-интерфейс является инвариантным. Однако COM имеет управление версиями, так что старый интерфейс можно настроить как совместимый с новым интерфейсом.

То, что Visual BASIC делает за кулисами, создает новую версию интерфейса com. Обновите номер версии, добавьте новые методы и настройте необходимую информацию, чтобы новый интерфейс мог автоматически использоваться со старым интерфейсом.

Как было указано, похоже, что события не выполняются автоматически. Я использовал Visual Studio OLE/COM Object View и вижу изменение GUID.

Возможное решение для гибридного VB6/.NET - это немного больно, но все ясно, когда вы вносите изменения. Сначала вам нужно использовать представление OLE / COM Object, чтобы получить IDL объекта VB6. Затем используйте компилятор MIDL для генерации библиотеки типов. Отныне используйте typelib в качестве ссылки.

Вам придется переименовать интерфейс, так как он будет конфликтовать с VB6 Name. Идея состоит в том, что и.NET, и VB6 будут ссылаться на библиотеку типов и реализовывать интерфейсы. В любое время, когда вы хотите обновить интерфейс, вы меняете IDL, перекомпилируете typelib и реализуете интерфейс для обоих.

Теперь, если это звучит немного сложно и уйдет WFT!? Я не виню тебя. Но в моем собственном проекте конвертации я нашел это полезным в определенных обстоятельствах, когда материал VB6 все еще находится в стадии разработки, но вам нужно использовать его в.NET

Теперь упрощенным решением может быть выявление и разделение минимума, необходимого для взаимодействия двух компонентов. Скажите события и некоторые особенности. Создайте IDL для этого интерфейса. Скомпилируйте typelib и используйте его как ссылку. Я сделал это также.

Я никогда не нашел способ предотвратить нарушение совместимости при добавлении событий. К сожалению, это одна из тех вещей, которые мне нужно исправить с первого раза (получить все мои новые события, параметры и т. Д.), Так что когда я нарушаю совместимость, мне нужно пройти через эту боль только один раз.

Боюсь, что я не нашел никакого способа сохранить константы GUID при изменении событий... но если вы используете сборку VB6 только в приложении.NET, можете ли вы просто добавлять dll VB6 каждый раз, когда создаете его заново, а затем создать ссылку на это вместо написания интерфейса в.NET вручную?

Другие вопросы по тегам