Когда использовать ReleaseComObject против FinalReleaseComObject? [дубликат]
этот вопрос уже есть ответ здесь:
когда я должен использовать Marshal.FinalReleaseComObject
vs Marshal.ReleaseComObject
?
есть ли опасность в использовании Marshal.FinalReleaseComObject
?
1 ответов
есть некоторая добродетель в FinalReleaseComObject
, это приведет к краху вашей программы быстрее. "COM-объект, который был отделен от его базового RCW, не может быть использован", - это среда CLR, сообщающая вам, что вы заботитесь о com-ссылках, а не оставляете его CLR, была ошибкой. Ваш пробег может отличаться, вы не можете доверять, чтобы получить его правильно, когда он работает на вашем компьютере dev. Убедитесь, что при развертывании кода в клиентском компьютере внедрена хорошая отчетность об ошибках машина.
достоинство в том, что в вашем коде есть только одно место, где вы ошиблись,FinalReleaseComObject
звонок. Он становится гораздо более размытым, когда вы используете ReleaseComObject
. Потому что это будет оставаться незамеченным на некоторое время, сбой вашей программы, когда среда CLR вызывает final IUnknown::Release()
, тот, который уничтожает объект. Очень далеко от неправильного ReleaseComObject
звонок. Но это сценарий судного дня, более вероятный результат заключается в том, что вызов просто не имеет никакого значения, потому что вы пропустили жесткий те. Как mumble["foo"]
, ссылка индексатора, которую так трудно увидеть в использовании.
Ну, мой совет очевиден: Не делай этого. Вы конкурируете с машиной, которая никогда ошибается. Это просто немного медленный процесс. Очень хороший "отчет из реальной жизни" - это здесь. Раздел "бесшумный убийца" наиболее актуален.
если это абсолютно необходимо, чтобы получить COM-сервер для выхода мгновенно, то пусть машина позаботится получать все счетчики на 0. Вы делаете это с GC.Собирать.)( Но имейте в виду, что вы должны правильно разместить этот вызов, если хотите, чтобы это также работало при отладке. Он не будет работать в том же методе, который использует COM-объекты, объясненные в ответ. Поместите его в метод вызова вместо этого.