Неожиданный вызов IConnectionPointImpl :: Unadvise в Windows Embedded Compact 7
У нас есть более крупное программное обеспечение, работающее на Win CE6 без проблем. Основные функции реализованы в DLL-библиотеке COM-сервера, которая обеспечивает точки подключения. Клиентская программа COM регистрирует обработчики событий для точек подключения при запуске программы, чтобы получать уведомления о состоянии и т. Д. При выходе из программы она отменяет регистрацию обработчиков, вызывая соответствующийIConnectionPointImpl::Unadvise
методы.
Теперь мы переносим программу для работы на Win EC 7. Новый пакет поддержки платы (BSP) для Win EC 7 работает хорошо. Существуют также разные версии с разными параметрами, созданные в разное время из разных источников от Microsoft, но наше программное обеспечение всегда показывает одну и ту же проблему.
При запуске программы, ~10 с после запуска, IConnectionPointImpl::Unadvise
неожиданно вызывается для всех зарегистрированных обработчиков событий. В нашем исходном коде есть только один метод, который вызываетIConnectionPointImpl::Unadvise
и это точно не выполняется.
Проблема появляется ~95%, но иногда программа запускается и работает без проблем. Мы не можем использовать отладчик из-за размера программы, производительность очень низкая.
Мы предполагаем, что среда выполнения COM вызывает IConnectionPointImpl::Unadvise
методы по некоторым причинам. Но мы не знаем, как этого избежать.
Кто-нибудь заметил такую же проблему? Есть ли решение / обходной путь? Спасибо.
1 ответ
Итак, мы наконец нашли, как решить эту проблему.
Мы убираем нашу зависимость от MarshalByReObject
и заменить его правильной реализацией ISerializable
.
Это позволяет нам правильно загружать внутри пользовательского AppDomain нашу сборку, и события больше не теряются.
Но это имеет побочный эффект для пути, по которому загружается сборочный файл конфигурации. Чтобы решить эту проблему, мы также реализуемAppDomain.AssemblyResolve
событие, которое позволяет перенаправить загрузку в нужное место.
Я надеюсь это тебе поможет;)