Ответ на ваш вопрос был рассмотрен здесь, я думаю:
Как правильно очистить объекты взаимодействия Excel в c
Я не могу видеть из вашего примера кода, но в основном всегда присваиваю ваши объекты Excel локальным переменным, никогда не опуская «две точки вниз», как это:
//FAIL
Workbook wkBook = xlApp.Workbooks.Open(@"C:\mybook.xls");
вместо ссылки на каждый объект в отдельности:
//WIN
Worksheets sheets = xlApp.Worksheets;
Worksheet sheet = sheets.Open(@"C:\mybook.xls");
...
Marshal.ReleaseComObject(sheets);
Marshal.ReleaseComObject(sheet);
.NET создает оболочку для COM-объекта, которая невидима для вас и не освобождается до тех пор, пока GC не сотворит свою магию.
Пока я не обнаружил это, я запускал приведенный ниже хакерский код в приложении ASP.NET каждый раз, когда создавал новую рабочую книгу, которая проверяет возраст процесса excel.exe и убивает все, которые старше минуты:
//force kill any excel processes over one minute old.
try
{
Process[] procs = Process.GetProcessesByName("EXCEL");
foreach (Process p in procs)
{
if (p.StartTime.AddMinutes(1) < DateTime.Now)
{
p.Kill();
}
}
}
catch (Exception)
{}