Вам нужно вызвать оба GC.Collect / GC.WaitForPendingFinalizers и Marshall.FinalReleaseComObject.
Подробнее см. Здесь мой ответ:
Как сделатьПравильно ли я очищаю объекты взаимодействия Excel?
Обратите внимание, что совет (и, по-видимому, самый популярный ответ) «никогда не использовать две точки» в любой заданной команде является действительным, но практически невозможно применить на практике,Если вы допустите какую-либо ошибку в каком-либо месте своего кода, приложение Excel будет зависать, и на планете нет инструмента профилирования, который мог бы вам помочь - вам придется просмотреть весь код на глаз.Для большой базы кода это практически невозможно.
В вашем коде нет вызова GC.WaitForPendingFinalizers после вызова GC.Collect.Это необходимо для обеспечения синхронности вызовов на сборку мусора.(GC.Collect работает в другом потоке, если вы не дождетесь его, коллекция может произойти не по порядку относительно выпусков вашего последующего объекта, и вы захотите выпустить второстепенные COM-объекты, такие как Ranges, first и majorCOM-объекты, такие как «Рабочие книги» и «Приложение», в конце концов.) После вызова GC.Collect и GC.WaitForPendingFinalizers вы захотите вызвать Marshall.FinalReleaseComObject для ваших именованных ссылок.
Короче говоря, стратегия заключается ввызовите GC.Collect и GC.WaitForPendingFinalizers, чтобы освободить COM-объекты, на которые вы не держите ссылку, и вызовите Marshall.FinalReleaseComObject, чтобы освободить COM-объекты, на которые вы действительно держите именованную ссылку.
- Mike