Есть ли какой-нибудь вред в убийстве COM-сервера без освобождения com-объектов в .net? - PullRequest
1 голос
/ 10 марта 2011

Народ - я создаю много COM-серверов (запускаю множество EXE) в .net, общаюсь с COM через COM -интероп, использую многочисленные COM-объекты на сервере и т. Д. Если я убью процесс, есть ли любой вред? Что плохого в том, чтобы НЕ освобождать все COM-объекты, которые я использовал через Marshal.FinalReleaseComObject ()? Будет ли со временем утечка памяти?

1 Ответ

3 голосов
/ 10 марта 2011

Полагаю, вы говорите о внепроцессных COM-серверах, хотя они встречаются гораздо реже, чем внутрипроцессные. Уничтожение клиентского приложения - это плохо, сервер никогда не получит вызовы освобождения, ресурсы для любых объектов, выделенных клиентом, будут использоваться до тех пор, пока EXE не будет завершен. Уничтожение серверного приложения приведет к сбою клиентского приложения с ошибками RPC, ничего не пропущено.

Нет ничего плохого в том, чтобы не использовать Marshal.FinalReleaseComObject (), подсчет ссылок на COM-объекты управляется RCW (вызываемой оболочкой во время выполнения). Это управляемый объект, как и любой другой в программировании .NET, сборщик мусора позаботится об этом. Счетчик ссылок уменьшается при запуске финализатора. Это произойдет непредсказуемо.

Использование Final / ReleaseComObject () может сделать его предсказуемым, но вы должны вызывать его для каждого объекта, который вы создаете. Что может быть сложно, не всегда очевидно, что вы создали его, например, при использовании индексатора. Также опасно, что неправильная синхронизация вызова или неправильное отслеживание всех ссылок на объект вызывает печально известное исключение «COM-объект, который был отделен от лежащего в его основе RCW, не может быть использовано». Хорошая история войны доступна здесь .

...