2010-04-02 1 views
6

До недавнего времени я считал, что время выполнения .NET увеличивает количество ссылок на COM-объекты на 1 при создании runtime-callable wrapper и что для любого данного объекта COM создается только одна такая оболочка, вызывающая время выполнения.Когда среда выполнения .NET имеет значение count> 1 для COM-объектов?

Если я не ошибаюсь, из вышеизложенного следует, что Marshal.FinalReleaseComObject и Marshal.ReleaseComObject делают то же самое на практике.

Однако сегодня я писал несколько тестов, чтобы проверить, что COM-объекты должным образом выпущены моим кодом. Я делаю это, вызывая предположительно выпущенный объект и проверяя ожидаемый InvalidComObjectException. Оказывается, бывают случаи, когда исключение бросается после FinalReleaseComObject, но не после ReleaseComObject.

Означает ли это, что среда выполнения .NET 2.0 может содержать более одной ссылки на COM-объект? Если да, то когда это делается?

ответ

5

Здесь есть дополнительный уровень косвенности. Да, RCW хранит единый счетчик ссылок на указатели интерфейса COM. Но RCW также имеет счетчик ссылок, он увеличивается каждый раз, когда указатель интерфейса COM сопоставляется с RCW. Что может произойти, если COM-метод возвращает указатель интерфейса. Финализатор соответствующего класса оболочки .NET уменьшает его.

Вы можете пометить этот счетчик ссылок непосредственно через Marshal.ReleaseComObject(), который уменьшает его на один, как это делает финализатор, и Marshal.FinalReleaseComObject(), который фиксирует его до нуля, гарантируя, что IUnknown :: Release (). Конечно, они попадают в категорию «лучше знать, что вы делаете». Неправильное поведение вызывает уродливое и неотверждаемое исключение «COM-объекта, отделенное от его основного RCW».

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

  • Нет связанных вопросов^_^