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