Подтвердить что ты не робот

Когда использовать ReleaseComObject и FinalReleaseComObject?

Когда следует использовать Marshal.FinalReleaseComObject vs Marshal.ReleaseComObject?

Есть ли опасность при использовании Marshal.FinalReleaseComObject?

4b9b3361

Ответ 1

В какой-то добродетель в FinalReleaseComObject, это приведет к сбою вашей программы быстрее. "COM-объект, который был отделен от его базового RCW, не может быть использован" - это CLR, говорящая вам, что вы заботитесь о COM-ссылке, подсчитываете себя, а не оставляете ее на CLR, была ошибкой. Ваш пробег может отличаться, вы не можете доверять ему, когда он работает на вашей машине dev. Убедитесь, что вы применяете хорошие отчеты об ошибках при развертывании кода на компьютере клиента.

Достоинство заключается в том, что в вашем коде есть только одно место, где вы ошибаетесь, вызов FinalReleaseComObject. При использовании ReleaseComObject он становится намного более пушистым. Потому что это покажется необнаруженным, сбой вашей программы, когда CLR вызывает окончательный IUnknown::Release(), тот, который уничтожает объект. Очень далеко от неправильного вызова ReleaseComObject. Но, что сценарий конца света, более вероятный результат заключается в том, что вызов просто не имеет никакого значения, потому что вы пропустили жесткие. Как mumble["foo"], ссылка индексатора, которую так трудно заметить, используется.

Хорошо, мой совет очевиден: не делайте этого. Вы конкурируете с машиной, которая никогда не ошибается. Это просто немного медленно при этом. Очень хороший "отчет из реальной жизни" доступен здесь. Раздел "тихий убийца" наиболее важен.

Если абсолютно необходимо немедленно запустить COM-сервер, то пусть машина позаботится о том, чтобы все отсчеты ссылок равнялись 0. Вы делаете это с помощью GC.Collect(). Но имейте в виду, что вы должны правильно разместить этот вызов, если хотите, чтобы это также работало при отладке. Он не будет работать в том же методе, который использует COM-объекты, объясненные в этом ответе. Поместите его в вызывающий метод.