Archer находится на правильном пути с ReleaseComObject
, но если вам нужно возиться с сборкой мусора, то вы допустили ошибку в своем коде автоматизации.
Наиболее вероятная причина этогоне закрытие - это то, что у вас есть бесхозные ссылки на некоторый объект, который вы не можете освободить, поскольку вы не сохранили его в переменной.Обычная причина этого заключается в том, что вы получаете доступ к нескольким «слоям» за один вызов.
Например, если вы делаете что-то вроде:
Workbooks("Book1").Sheets("Sheet1").Range("A1:A2").Value = 1;
Тогда вы создадите ссылки на рабочую книгу., Sheet и Range (и, может быть, и коллекцию Sheets тоже?), ни один из которых вы не можете выпустить должным образом.
Таким образом, вместо этого вы должны разбить его на этапы с чем-то вроде этого (записанным полностью из памяти ис точки зрения позднего связывания, и я мог упустить что-то еще, что вам нужно выпустить):
object wb = Workbooks("Book1");
object sheet = wb.Sheets("Sheet1");
object range = sheet.Range("A1:A2");
range.Value = 1;
Marshal.ReleaseComObject(range);
Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(wb);
В обычных условиях вам не нужно останавливать процесс или принудительно собирать мусор, и толькоя могу вспомнить, когда мне приходилось делать это, когда в моем коде были ошибки.