ielsky Ответов: 3

Исключение" COM-объект, который был отделен от базового RCW, не может быть использован"


Всем Привет.

У меня странная ситуация в моем приложении (MS Outlook Addin).

Я работаю с объектом MailItem в Item.Откройте обработчик событий.
Я получаю объект инспектора, вызывающий MailItem.Свойство GetInspector.
Когда я пытаюсь установить обработчик для инспектора.Вызывается событие Close InvalidComObjectException с сообщением "COM-объект, который был отделен от своего базового RCW, не может быть использован".

Фрагмент кода:
MailItem mailItem;
...
InspectorEvents_10_Event inspectorEvents = mailItem.GetInspector;
inspectorEvents.Close += delegate {.....}; //Exception occurs


На мой взгляд, это невозможная ситуация. Нет никакого призыва Marshal.ReleaseComObject между получением инспектора и его использованием.

Эта ошибка воспроизводится очень редко, поэтому я не могу поймать ее во время отладки.

Есть предложения?

3 Ответов

Рейтинг:
27

Nish Nishant

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


ielsky

Спасибо вам за ответ.

Я проверил журнал приложений. Идентификатор потока в том месте, где возникает ошибка, совпадает с идентификатором потока в обработчике NewInspector (где мы получаем инспектор). Так что мне нужна еще одна идея.

ncc01

Привет, я сталкиваюсь с той же проблемой, что и отладка, потому что тестовый случай не уникален. вы нашли решение? Я очень ценю вашу помощь заранее.

Рейтинг:
2

Jason_Kiscy

эй,

Hi, I am facing the same problem it is really difficult to debug it because the test case is not unique. did you find a solution? I really appreciate your help in advance.Here is my mailbox:1424870395@qq.com


Рейтинг:
0

Sergey Aseev

Вам нужно иметь сильную привязку к событию.
Что-нибудь вроде этого

MailItem mailItem;
CloseEvent closeEvent;
...
InspectorEvents_10_Event inspectorEvents = mailItem.GetInspector;
closeEvent = inspectorEvents.Close;
closeEvent += delegate {.....};