Вы не должны вызывать ReleaseComObject.Это старая история о женах, которая началась давно, но она неверна .
Если вы видите, что экземпляры Excel держатся вокруг него, это, вероятно, означает, что ваша программа завершилась без запуска сборщиков мусора и ссылок, которые все еще хранятся в com-объектах.Лучший способ решить вашу проблему - полностью избавиться от функции релиза, а затем вызвать GC.Collect()
после возврата метода doWork()
.
private void doWork()
{
try
{
doWorkImpl();
}
finally
{
GC.Collect(); //The GC collect needs to be here, after the scope of doWorkImpl ends.
GC.WaitForPendingFinalizers(); //The excel instance gets closedin the finalizer.
}
}
private void doWorkImpl()
{
var excelApp = new MsExcel.Application();
var workBooks = excelApp.Workbooks;
var workbook = excelApp.Workbooks.Add();
var worksheet = workbook.Sheets[1]; //This needs to be a local variable, not a class variable.
//Do Work Here
worksheet.SaveAs(filePath);
workbook.Close(false,System.Reflection.Missing.Value,System.Reflection.Missing.Value);
workBooks.Close();
excelApp.Quit();
}
Это должно привести к тому, что экземпляр excel будет работать до тех пор, покаисключение не было выдано, и excelApp.Quit()
успешно вызван.
Однако, если вы работаете только с файлами xlsx вместо файлов xsl, я бы сильно рекомендовал бы отойтииз com-взаимодействия и просто используйте , Microsoft SDK предоставляет для непосредственного взаимодействия с файлами .xlsx.