У меня есть COM-объект, разработанный на C ++. Этот класс использует другой (сторонний) COM-объект, который генерирует событие EvtThirdParty. Этот сторонний объект - просто метод моего класса.
Теперь я использую мой COM-объект из приложения .NET (для чего он стоит), и я хотел бы перехватить EvtThirdParty из приложения Visual Basic.
Я предполагаю, что нет тривиального способа сделать это, но давайте эту информацию здесь на всякий случай, если кто-то укажет один. Итак, я добавил одно событие (EvtThirdPartyDummy) в мой COM-объект, и всякий раз, когда он захватывает EvtThirdParty, вызывает EvtThirdPartyDummy для VB.NET.
Пока все хорошо.
Теперь, когда приложение получает это событие, оно должно сделать пару вызовов моему объекту, чтобы получить некоторую информацию.
Вот тут и начинаются мои проблемы. Я получаю странное сообщение об отключенном контексте:
Обнаружен отключенный контекст
Сообщение: контекст 0x1b9351e0 'is
отсоединен. Освобождение интерфейсов
из текущего контекста (контекста
0x1b934f90). Это может привести к коррупции
или потеря данных. Чтобы избежать этой проблемы,
пожалуйста, убедитесь, что все
контексты / квартиры остаются в живых до
приложение полностью сделано
с RuntimeCallableWrappers, которые
представляют компоненты COM, которые живут
внутри них.
Я не АБСОЛЮТНО уверен, что это ТОЧНОЕ сообщение, которое я получаю, так как моя Visual Studio 2005 написана на испанском языке, и я нашел это в Google, но, кажется, достаточно близко. Есть некоторые различия (например, заголовок моего сообщения гласит «Visual Studio 2005», IIRC, но это может быть связано с другой версией IDE).
Из того, что я нашел в Google, похоже, что нить, в которой был создан объект, была уничтожена, но я почти уверен, что это не так. Он создается в главном потоке приложений.
Если я удаляю весь код из обработчика событий, все работает как чудо.
Мое предположение заключается в том, что мое событие обрабатывается в совершенно новой ветке, но AFAIK этого не должно быть.
Что происходит?