'Похоже, это было слишком сложно. По моему опыту, для правильного закрытия Excel есть только три ключевых момента:
1: убедитесь, что нет ссылок на созданное вами приложение Excel (у вас должно быть только одно; установите его в null)
2: вызов GC.Collect ()
3: Excel должен быть закрыт либо пользователем, вручную закрывающим программу, либо вызовом Quit для объекта Excel. (Обратите внимание, что Quit будет работать так же, как если бы пользователь пытался закрыть программу, и отобразит диалоговое окно подтверждения, если есть несохраненные изменения, даже если Excel не виден. Пользователь может нажать «Отмена», после чего Excel не будет закрыт. .)
1 должно произойти раньше, чем 2, но 3 может произойти в любое время.
Один из способов реализовать это состоит в том, чтобы обернуть объект Excel взаимодействия с вашим собственным классом, создать экземпляр взаимодействия в конструкторе и реализовать IDisposable с Dispose, похожим на
Это очистит Excel от проблем вашей программы. После закрытия Excel (вручную пользователем или вызовом Quit) процесс исчезнет. Если программа уже была закрыта, процесс исчезнет при вызове GC.Collect ().
(Я не уверен, насколько это важно, но вы можете захотеть вызвать GC.WaitForPendingFinalizers () после вызова GC.Collect (), но не обязательно избавляться от процесса Excel.)
Это работало для меня без проблем в течение многих лет. Имейте в виду, что хотя это работает, вам действительно нужно изящно закрыться, чтобы это работало. Вы по-прежнему будете накапливать процессы Excel.exe, если прервете свою программу до очистки Excel (обычно нажимая «stop» во время отладки вашей программы). '