Ошибка InvalidCastException возникает, когда метод IUnknown :: QueryInterface() интерфейса COM возвращает код возврата ошибки E_NOINTERFACE. Две основные причины этого. Обычным является то, что объект COM просто не реализует интерфейс, на который вы производите. Это, однако, очень повторяемо, на него не может влиять сеанс отладки.
Вторая причина сложнее и связана с резьбой. Когда вы используете RCW в другом потоке, CLR автоматически маршалирует указатель интерфейса. Это требует, чтобы COM-сервер либо явно реализовал интерфейс IMarshal, либо зарегистрировал DLL-прокси/заглушку (построенную из IDL), либо поддерживал стандартный маршаллер (использует библиотеку типов).
Это не универсально, существует много COM-серверов, которые просто предполагают, что они будут использоваться только из одного потока. Отладчик входит в игру, потому что он оценивает выражения в окне «Часы». Он фактически запускает код для получения значения выражения. Точные правила плохо документированы, о которых я знаю, но иногда этот код будет работать в вспомогательном потоке. Типично, например, если вы использовали Debug + Break All для входа в программу. Эта вспомогательная нить собирается бомбить, если сервер COM не поддерживает маршалинг. Необходимо проверить, что поток, которому принадлежит COM-объект, является текущим потоком. Debug + Windows + Threads и дважды щелкните по существующий поток (обычно это основной поток вашего приложения).
Не отличное объяснение, это не шлем для наблюдения, но я подозреваю, что это близко к проблеме. Не так много вы можете сделать, избегайте использования окна «Часы» для отображения свойств COM-сервера. Или напишите немного кода отладки, чтобы скопировать свойство сервера в локальную переменную, вместо этого поставьте Watch на эту переменную.
Сохраняет ли GC.KeepAlive ссылочные и лежащие в основе объекты COM? –
Я еще не пробовал, но это значит, что я должен вызвать его для каждого COM-объекта, который у меня есть в моем коде. Это верно? – kamilw
попробуйте в отдельной части, чтобы увидеть, имеет ли он эффект в этой области. –