Слабая связь COM в C# или Как избежать COMException 0x80040154

У меня есть приложение .Net 2 C #, которое я разрабатываю, которое использует COM-DLL, созданную VB 6. VB DLL часто обновляется, когда мое приложение падает с ошибкой System.Runtime.InteropServices.COMException (0x80040154). Часть COM DLL, которую я использую, не изменится, но изменится версия (и CLSID).

Опция «Конкретная версия» для ссылки неверна. WrapperTool — это tlbimp.

Как мне сказать моему приложению, чтобы оно не беспокоилось об изменениях в DLL? Есть ли способ проверить только функции, которые я использую?


person John Hartley    schedule 15.03.2010    source источник
comment
Я использовал этот код в другом месте: // возвращает ссылку на самое верхнее окно. [DllImport(user32.dll, CharSet=CharSet.Auto, ExactSpelling=true)] public static extern IntPtr GetActiveWindow(); Это единственный ответ?   -  person John Hartley    schedule 16.03.2010


Ответы (1)


Это одна из наиболее распространенных ошибок COM: «Класс не зарегистрирован». Он начинается с VB6, у него есть возможность контролировать бинарную совместимость. Я точно забыл, как это выглядит, это было слишком давно. Если вы не контролируете это, VB6 создаст новый COM-сервер с другими значениями CLSID. Для этого требуется перерегистрация DLL с помощью Regsvr32.exe. И повторная генерация библиотеки взаимодействия с помощью Tlbimp.exe. Последний шаг, вероятно, тот, который вы пропустили.

Обратите внимание, что использование разных значений CLSID является жестким требованием для COM, это должно выполняться при изменении общедоступного интерфейса. Но не тогда, когда меняется только реализация.

person Hans Passant    schedule 16.03.2010
comment
Спасибо. Зарегистрирована более новая COM DLL. Я также обнаружил, что CLSID не изменился. - person John Hartley; 16.03.2010
comment
Извините, мистер Багз. Я пропустил шаг, который всегда пропускаю, шаг Tlbimp.exe. IDE (SharpDevelop) должна вызывать его при компиляции. - person John Hartley; 18.03.2010
comment
tlbimp.exe не существует на компилирующей машине. Интересно, какую магию SharpDevelop использует для создания DLL взаимодействия... - person John Hartley; 18.03.2010