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