Подтвердить что ты не робот

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

У меня есть COM-компонент, который я вызываю из некоторой С# dll.

У меня также есть приложение winforms, которое использует эту .dll.

Когда я закрываю приложение, я получаю это исключение:

COM-объект, который был отделен от его базового RCW не может быть б.

Трассировка стека показывает, что это исключение происходит от деструктора в DLL. Я применил этот деструктор для вызова некоторого метода очистки в COM.

Почему это происходит? Как лучше всего это решить?

4b9b3361

Ответ 1

Проблема описана здесь:

Безопасно ли вызывать RCW из финализатора?

и здесь:

Отпустите объект Excel в моем деструкторе

Проблема в том, что не только время, когда эти объекты должны быть неопределенными, но порядок, в котором финализаторы называются также недетерминированными. В этом случае В Runtime Callable Wrapper также есть финализатор, который вызывает Marshal.FinalReleaseComObject сам по себе, который имеет результат уменьшая счетчик ссылок на стороне COM забора, чтобы этот COM-объект может быть выпущен. Но так как порядок, в котором финализаторы называются неопределенными, очень возможно, что финализаторы для COM-объектов, которые будут ссылаться на ваши объекты перед финализатором для вашего объекта. Таким образом, код в вашем финализатор может работать иногда, но в большинстве случаев один или несколько Runtime Callable Wrappers, что ваши ссылки на объекты будут иметь уже были вызваны их финализаторы, и основной объект COM будет были выпущены до того, как ваш финализатор выполнит свой код.