Могу ли я вызвать Marshall .ReleaseComObject в финализаторе?

#c# #.net #dispose #finalizer

#c# #.net #утилизировать #финализатор

Вопрос:

Я нашел в нашей базе кода такой код:

 if (disposing)
{
    ....
}
Marshal.ReleaseComObject(comObject)
  

Поскольку ComObject на самом деле является .Сетевой объект (RCW, верно?) безопасно ли вызывать его из финализатора?

Возможно ли, что он уже выпущен?

Комментарии:

1. Нет, это небезопасно, у RCW уже есть свой собственный финализатор. Что в первую очередь делает код совершенно ненужным. Более серьезно, поскольку порядок завершения не является детерминированным, вы можете вызывать ReleaseComObject() для объекта, который уже уничтожен.

2. Спасибо, если вы укажете это как ответ, я отмечу его как решение.

3. Конечно, вы можете опубликовать лучший ответ? Я не знаю, что происходит, когда вы вызываете ReleaseComObject() для уничтоженного объекта, я никогда не ошибался намеренно.

4. @HansPassant: извините, я вас не понимаю. Я просил просто переместить комментарий в ответ, чтобы я мог пометить его как принятый ответ, поскольку я не могу сделать это в комментарии.

Ответ №1:

Как Hans Passant сказано:

Нет, это небезопасно, у RCW уже есть свой собственный финализатор. Что в первую очередь делает код совершенно ненужным. Более серьезно, поскольку порядок завершения не является детерминированным, вы можете вызывать ReleaseComObject() для объекта, который уже уничтожен

Таким образом, вызов должен быть внутри if (удаление).