Я попытался запустить ваш код, но не смог воспроизвести проблему. Если я прохожу через него с помощью отладчика, процесс Excel завершается после последнего вызова FinalReleaseComObject
. Возможно ли, что виновник лежит в каком-то коде, которого нет в вашем списке?
При использовании COM-взаимодействия я обнаружил, что слишком легко увеличить счетчик ссылок на COM-объекты очень тонкими способами. Например, допустим, вы делаете что-то вроде этого:
excelWorkbook.Foo.Bar();
Это может увеличить счетчик ссылок на объект Foo
, оставляя вас без средств для его последующего освобождения ... и оставляя процесс Excel задерживаться, пока вы не закроете свое приложение. Вы можете переписать приведенную выше строку кода следующим образом:
Foo foo = excelWorkbook.Foo;
foo.Bar();
Marshal.ReleaseComObject(foo);
Это не так красиво, но это уменьшит счетчик ссылок на объект Foo
после того, как вы его закончили.