Excel process not closing
c#, excel, winforms
Solution
Here is an interesting knowledge base on the subject of office apps staying open after a .NET app disconnects from them.
Office application does not quit after automation from Visual Studio .NET client
The code examples are all in the link (vb.net sorry). Basically it shows you how to correctly setup and tear down the office app so that it closes when you're finished with it.
`System.Runtime.InteropServices.Marshal.FinalReleaseComObject` is where the magic happens.
EDIT: You need to call the FinalReleaseComObject for each excel object that you've created.
if (excelWorkSheet1 != null)
{
Marshal.FinalReleaseComObject(excelWorkSheet1);
excelWorkSheet1 = null;
}
if (excelWorkbook != null)
{
Marshal.FinalReleaseComObject(excelWorkbook);
excelWorkbook = null;
}
if (excelApp != null)
{
Marshal.FinalReleaseComObject(excelApp);
excelApp = null;
}
Problem
I've got this C# program that never closes the Excel process. Basically it finds the number of instances a string appears in a range in Excel. I've tried all kinds of things, but it's not working. There is a Form that is calling this method, but that shouldn't change why the process isn't closing. I've looks at suggestions by Hans Passant, but none are working. EDIT: I tried the things mentioned and it still won't close. Here's my updated code. EDIT: Tried the whole Process.Kill() and it works, but it seems like a bit of a hack for something that should just work. ``` public class CompareHelper { // Define Variables Excel.Application excelApp = null; Excel.Workbooks wkbks = null; Excel.Workbook wkbk = null; Excel.Worksheet wksht = null; Dictionary<String, int> map = new Dictionary<String, int>(); // Compare columns public void GetCounts(string startrow, string endrow, string columnsin, System.Windows.Forms.TextBox results, string excelFile) { results.Text = ""; try { // Create an instance of Microsoft Excel and make it invisible excelApp = new Excel.Application(); excelApp.Visible = false; // open a Workbook and get the active Worksheet wkbks = excelApp.Workbooks; wkbk = wkbks.Open(excelFile, Type.Missing, true); wksht = wkbk.ActiveSheet; ... } catch { throw; } finally { GC.Collect(); GC.WaitForPendingFinalizers(); if (wksht != null) { //wksht.Delete(); Marshal.FinalReleaseComObject(wksht); wksht = null; } if (wkbks != null) { //wkbks.Close(); Marshal.FinalReleaseComObject(wkbks); wkbks = null; } if (wkbk != null) { excelApp.DisplayAlerts = false; wkbk.Close(false, Type.Missing, Type.Missing); Marshal.FinalReleaseComObject(wkbk); wkbk = null; } if (excelApp != null) { excelApp.Quit(); Marshal.FinalReleaseComObject(excelApp); excelApp = null; } GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); GC.WaitForPendingFinalizers(); /* Process[] processes = Process.GetProcessesByName("EXCEL"); foreach (Process p in processes) { p.Kill(); } */ } } } ```