Я знаю основную разницу, так как ReleaseComObject
только уменьшает какой-то счетчик на единицу, а FinalReleaseComObject
уменьшает его до нуля.
Итак, что я обычно слышу, так это вызов FinalReleaseComObject
, потому что тогда вы уверены, что COM-объект действительно освобожден.
Но это заставляет меня задуматься, есть ли смысл в этом счетчике, верно? Разве вы не нарушаете этот механизм, если всегда вызываете FinalReleaseComObject
. Если этот счетчик не равен единице до того, как вы вызовете ReleaseComObject
, возможно, для этого нет причины?
Что может привести к тому, что он будет выше единицы, когда он не должен быть?
Заранее спасибо.
PS: Мой опыт работы с COM состоит только из использования Excel Interop. Не уверен, что этот вопрос является локальным для этого домена (т. е. вне Office Interop, FinalReleaseComObject
используется нечасто).
Обновление 1
В статье Дэн рассказывает об использовании ReleaseComObject
, когда вы снова сделано. Насколько я понял из статьи, это нормальный способ. Я думаю, что если вы делаете это последовательно, это должно работать нормально. В комментарии к статье автор предлагает кому-то вызывать ReleaseComObject
в цикле, пока он действительно не будет освобожден (статья из 2006 года, так что это аналог вызова FinalReleaseComObject
). Но он также заявляет, что это может быть опасно.
Если вы действительно хотите, чтобы RCW вызывал Release() в определенной точке кода, вы можете вызывать ReleaseComObject() в цикле, пока возвращаемое значение не достигнет нуля. Это должно гарантировать, что RCW вызовет Release(). Однако если вы это сделаете, имейте в виду, что когда другие управляемые ссылки попытаются использовать этот RCW, это вызовет исключение».
Это наводит меня на мысль, что действительно не всегда вызывать FinalReleaseComObject
— хорошая идея, так как вы можете вызвать исключения в другом месте. Как я понимаю сейчас, вы должны вызывать это только в том случае, если вы абсолютно уверены, что можете это сделать.
Все-таки у меня мало опыта в этом деле. Я не знаю, как я могу быть уверен. Если счетчик увеличивается, когда этого быть не должно, не лучше ли исправить эту проблему? Если это так, то я бы сказал, что FinalReleaseComObject
— это скорее хак, чем лучшая практика.