如何释放为Excel创build的对象(C#)

我使用一些对象,如工作簿,工作表,Excel任务的应用程序。 完成Excel后,我尝试通过下面的代码释放它们。 毕竟,我仍然可以在任务pipe理器中看到EXCEL.EXE。 为什么它不完全释放?

我的Excel任务类:

Excel._Application app = new Excel.Application(); Excel._Workbook workbook = app.Workbooks.Add(Type.Missing); Excel._Worksheet worksheet = null; app.Visible = true; worksheet.Cells[1, 1] = "test string"; workbook.SaveAs("C:\testfile.xlsx"); object misValue = System.Reflection.Missing.Value; workbook.Close(true, misValue, misValue); app.Quit(); releaseObject(worksheet2); releaseObject(workbook); releaseObject(app); 

releaseObject类:

  private void releaseObject(object obj) { try { System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); obj = null; } catch (Exception ex) { obj = null; MessageBox.Show("Unable to release the Object " + ex.ToString()); } finally { GC.Collect(); } } 

EXCEL.EXE仍在任务pipe理器中: 在这里输入图像说明

已经回答见:

如何正确清理Excel互操作对象?

基本上COM对象是非托pipe对象(DUH),当它们超出范围时不会被释放。 System.Runtime.InteropServices.Marshal.ReleaseComObject()可以用来释放它们(在垃圾回收器中),但是你必须保证所有对象的引用:excelApp.Worksheets.Open()创build两个对象:使用Open()方法打开的集合“工作表”和“工作表”。

从任务pipe理器中使用Process来清除EXCEL对象非常容易,请参阅下面的内容和享受..

 //Kill the all EXCEL obj from the Task Manager(Process) System.Diagnostics.Process[] objProcess = System.Diagnostics.Process.GetProcessesByName("EXCEL"); if (objProcess.Length > 0) { System.Collections.Hashtable objHashtable = new System.Collections.Hashtable(); // check to kill the right process foreach (System.Diagnostics.Process processInExcel in objProcess) { if (objHashtable.ContainsKey(processInExcel.Id) == false) { processInExcel.Kill(); } } objProcess = null; } //In case of you want to quit what you have created the Excel object from your application //just use below condition in above, if(processInExcel.MainWindowTitle.ToString()== "") 

我已经做了Office Interop已经有一段时间了(我实际上是使用它的Outlook,但概念应该是相同的)。 我能够完全释放一切的唯一方法就是这样做:

 GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); 

试一试….

这是我无法解决的问题。 我以前见过所有这些答案,而且我已经实施了所有这些答案,但仍然没有closures。 我不得不用蛮力去做事情。 我所做的是创build一个BAT文件,并从我的程序运行它。 这里是文件的内容:

 Taskkill /F /IM excel.exe 

这将会调用你所有的excel运行。 我会用这个,如果你不能找出一个不同的解决scheme。

您需要通过这样做closuresExcel应用程序,因为它会在后台打开Excel程序。

 app .Application.Quit(); 

按以下方式在代码中添加上面的行代码:

  object misValue = System.Reflection.Missing.Value; workbook.Close(true, misValue, misValue); app .Application.Quit(); app.Quit();