Полагаю, вы говорите о внепроцессных COM-серверах, хотя они встречаются гораздо реже, чем внутрипроцессные. Уничтожение клиентского приложения - это плохо, сервер никогда не получит вызовы освобождения, ресурсы для любых объектов, выделенных клиентом, будут использоваться до тех пор, пока EXE не будет завершен. Уничтожение серверного приложения приведет к сбою клиентского приложения с ошибками RPC, ничего не пропущено.
Нет ничего плохого в том, чтобы не использовать Marshal.FinalReleaseComObject (), подсчет ссылок на COM-объекты управляется RCW (вызываемой оболочкой во время выполнения). Это управляемый объект, как и любой другой в программировании .NET, сборщик мусора позаботится об этом. Счетчик ссылок уменьшается при запуске финализатора. Это произойдет непредсказуемо.
Использование Final / ReleaseComObject () может сделать его предсказуемым, но вы должны вызывать его для каждого объекта, который вы создаете. Что может быть сложно, не всегда очевидно, что вы создали его, например, при использовании индексатора. Также опасно, что неправильная синхронизация вызова или неправильное отслеживание всех ссылок на объект вызывает печально известное исключение «COM-объект, который был отделен от лежащего в его основе RCW, не может быть использовано». Хорошая история войны доступна здесь .