Я не могу закрыть Excel после этого метода. Я попытался использовать некоторые методы, которые нашел в StackOverflow, но, похоже, ничего не добился. Пожалуйста, посмотрите, что я делаю не так? Спасибо!
public void readAllFromXLS()
{
Excel.Application refExcel = new Excel.Application();
Excel.Workbook refFile = refExcel.Workbooks.Open(Application.StartupPath + "\\Resources\\reference files\\price list.xlsx");
try
{
string workSheet;
if (Form1.sesion.isSRA)
workSheet = "SRA";
else
workSheet = "Standard";
Excel.Worksheet refSheet = refFile.Sheets[workSheet] as Excel.Worksheet;
for (int row = 2; row <= refSheet.UsedRange.Rows.Count; row++)
{
Some Cell Reading Here...
}
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.FinalReleaseComObject(refSheet);
}
catch (Exception e)
{
DialogResult r = MessageBox.Show("Price List Excel File Error.", "File Read Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Application.Exit();
Console.WriteLine("------");
Console.WriteLine(e);
}
GC.Collect();
GC.WaitForPendingFinalizers();
Marshal.FinalReleaseComObject(refFile);
refExcel.Quit();
Marshal.FinalReleaseComObject(refExcel);
}
По какой причине вы звоните в refExcel.Quit()послеGC.Collect?
@ MickyD, спасибо за ссылку, которую я уже видел, я не вижу, что не так с тем, что я делаю.
@mjwills спасибо, что посмотрели на него, я просто пробовал разные версии, чтобы увидеть, поможет ли это в моей ситуации.
Если вы хотите использовать технику GC.Collect, вам обязательно нужно вызвать refExcel.Quit()первый. Затем в функции, которую звонкиreadAllFromXLS выполняет GC.Collect(); GC.WaitForPendingFinalizers();, повторяется три раза.





В своей книге «Разработка .NET для Micorsoft Office». Эндрю Уайтчепел рекомендовал принудительно запустить сборку мусора дважды.
Вот пример кода из его блог
if (excel != null)
{
excel.Quit();
excel = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
GC.WaitForPendingFinalizers();
Как уже указывалось, вы должны вызвать Quit перед сборкой мусора.
Я успешно использовал эту технику, но теперь переключился на OpenXML SDK, который, на мой взгляд, намного лучше, чем автоматизация Excel. На самом деле ClosedXML может быть даже лучше, но я еще не использовал его.
Спасибо за предложение GC, с этого момента я сделаю это. Я ненавижу службу MS COM, но на данный момент у меня нет другого выхода. С Уважением.
Возможный дубликат Как очистить ссылки COM в .NET, когда приложение останется запущенным?