2010-09-13 7 views
0

Я не уверен, если название достаточно, но вот моя проблема:исчезают COM объекты при отладке

У меня есть приложение writtten в .NET 4.0, который использует некоторые COM-объекты. Когда я устанавливаю точку останова и слишком долго проверяю свой код, когда я пытаюсь выполнить строку кода, связанную с COM, я получаю исключение. Если я пройду через свой код относительно быстро, все будет в порядке.

Есть ли какой-то переключатель, чтобы предотвратить это? Что вызывает такое поведение?

Препятствие, которое я получаю, имеет тип InvalidCastException.

Заранее спасибо

+0

Сохраняет ли GC.KeepAlive ссылочные и лежащие в основе объекты COM? –

+0

Я еще не пробовал, но это значит, что я должен вызвать его для каждого COM-объекта, который у меня есть в моем коде. Это верно? – kamilw

+0

попробуйте в отдельной части, чтобы увидеть, имеет ли он эффект в этой области. –

ответ

0

Являются ли эти объекты удаленными или локальными? Если удаленный, возможно, ваши точки останова вызывают тайм-ауты RPC.

+0

Нет, эти объекты являются локальными. – kamilw

0

Вы уверены, что ссылка на COM-объект (-ы) верна. В противном случае ОС увидит, что объект COM больше не ссылается и, следовательно, освобождает его из памяти.

+0

Это тот же код. Разница заключается в том, как быстро я могу пройти код – kamilw

1

Ошибка InvalidCastException возникает, когда метод IUnknown :: QueryInterface() интерфейса COM возвращает код возврата ошибки E_NOINTERFACE. Две основные причины этого. Обычным является то, что объект COM просто не реализует интерфейс, на который вы производите. Это, однако, очень повторяемо, на него не может влиять сеанс отладки.

Вторая причина сложнее и связана с резьбой. Когда вы используете RCW в другом потоке, CLR автоматически маршалирует указатель интерфейса. Это требует, чтобы COM-сервер либо явно реализовал интерфейс IMarshal, либо зарегистрировал DLL-прокси/заглушку (построенную из IDL), либо поддерживал стандартный маршаллер (использует библиотеку типов).

Это не универсально, существует много COM-серверов, которые просто предполагают, что они будут использоваться только из одного потока. Отладчик входит в игру, потому что он оценивает выражения в окне «Часы». Он фактически запускает код для получения значения выражения. Точные правила плохо документированы, о которых я знаю, но иногда этот код будет работать в вспомогательном потоке. Типично, например, если вы использовали Debug + Break All для входа в программу. Эта вспомогательная нить собирается бомбить, если сервер COM не поддерживает маршалинг. Необходимо проверить, что поток, которому принадлежит COM-объект, является текущим потоком. Debug + Windows + Threads и дважды щелкните по существующий поток (обычно это основной поток вашего приложения).

Не отличное объяснение, это не шлем для наблюдения, но я подозреваю, что это близко к проблеме. Не так много вы можете сделать, избегайте использования окна «Часы» для отображения свойств COM-сервера. Или напишите немного кода отладки, чтобы скопировать свойство сервера в локальную переменную, вместо этого поставьте Watch на эту переменную.

+0

Мне не нужно ничего делать. Нет окна для просмотра. Нет оценок. Просто перейдите в точку останова, подождите минуту или две, а затем нажмите F10 на линии с объектом COM. – kamilw

+0

Не знаю. По крайней мере, опубликуйте несколько строк кода. –

Смежные вопросы