Что может вызвать ошибку времени выполнения Vb6 430

У меня есть COM-библиотека, написанная на vb6. Когда я пытаюсь создать новый объект модуля класса из этой DLL, я получаю ошибку таймера запуска 430: класс не поддерживает автоматизацию или не поддерживает ожидаемый интерфейс. Интересно, что это происходит только вне среды IDE, когда я отлаживаю изнутри IDE, нет ошибки, и новый объект класса создается успешно. В чем может быть причина?

В общем, я иногда получаю такие ошибки в библиотеках COM. Каков наилучший способ отладки проблем COM? Как узнать путь к dll, который используется при запуске программы?

Ответ 1

Если этот проект полностью находится в VB6. Вероятная причина этого в том, что EXE имеет копию бинарного файла DLL в этом каталоге. Когда вы запускаете его, вместо этой скомпилированной копии используется эта копия. Когда вы используете методы или классы ADD, EXE становится несовместимым со старой DLL. Если вы исправили ошибку или просто работали с внутренним кодом, EXE будет работать, но он использовал старую DLL.

Установите DLL в двоичную совместимость. Убедитесь, что у вас есть совместимый каталог. Поместите DLL последней версии там. Укажите двоичную совместимость с этой DLL. Убедитесь, что ваш EXE скомпилирован в каталог проекта. Запустите EXE из каталога проекта. Таким образом, он будет использовать собранную DLL. Вам нужно написать утилиту, чтобы вы могли компилировать каждый проект отдельно. Проверьте свою настройку с помощью виртуального ПК или другого компьютера.

Все эти шаги помогут избежать DLL Hell. Мой собственный проект имеет два десятка проектов ActiveX в 6 слоях. Когда я принял вышеуказанные мои проблемы с DLL Hell, почти ничего не осталось.

Ответ 2

Прочитайте бинарный файл vs совместимым образом.

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

Используйте совместимость проекта, если вам нужно внести изменения (например, удалить старые общедоступные методы). Однако, если вы это сделаете, вам придется перекомпилировать все другие приложения, использующие общую DLL.

Ответ 3

Это почти наверняка проблема с версией, иногда называемая "DLL-ад".

Фон состоит в том, что мир .NET явно разработан, чтобы позволить интерфейсам развиваться, сохраняя одно и то же имя. Но в мире COM интерфейсы считаются неизменными.

Когда вы работаете в среде IDE, Visual Studio создает новую оболочку COM Interop для dll COM при каждом запуске вашего решения. Но если вы не выпускаете и не заменяете все свое решение каждый раз, включая совершенно новую оболочку COM Interop, вы столкнетесь с проблемой проверки версий, где .NET-код ожидает один COM-интерфейс, но видит другой.

EDIT. По какой-то причине я предположил, что вы пытаетесь использовать COM-компонент из .NET-компонента. Если все решение на самом деле является VB6, то решение г-на Конли является рекомендуемым подходом. Здесь хорошая ссылка, в которой обсуждается проблема.