Когда использовать 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-объекты, объясненные в ответ. Поместите его в метод вызова вместо этого.