How to release objects which are created for Excel (C#)
本问题已经有最佳答案,请猛点这里访问。
我使用一些对象,如工作簿、工作表、Excel任务应用程序。在使用完Excel之后,我尝试通过下面的代码释放它们。毕竟,我仍然在任务管理器中看到excel.exe。为什么它不能完全释放?
我的Excel任务类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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仍在任务管理器中:
已回答请参阅:
如何正确清理Excel Interop对象?
基本上,COM对象是非托管对象(DUH),当它们超出范围时不会被释放。System.Runtime.InteropServices.Marshal.ReleaseComObject()可用于在最终确定之前(在垃圾收集器中)释放它们,但必须确保保留对所有对象的引用:excelapp.worksheets.open()创建两个对象:集合"worksheets"和用open()方法打开的"worksheet"。
使用过程可以很容易地从任务管理器中删除Excel对象,请参见下面的享受。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //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()=="") |
这是一个我无法解决的问题。我以前看过所有这些答案,我已经实现了所有这些答案,但Excel并没有结束。我不得不用蛮力做事。我所做的是创建一个BAT文件并从我的程序中运行它。以下是文件的内容:
1 | Taskkill /F /IM excel.exe |
这将使你所有的优秀运动员都能跑起来。如果你找不到不同的解决方案,我会用这个。
我已经有一段时间没有做过Office Interop了(实际上我在Outlook中使用它,但是概念应该是相同的)。唯一能完全释放一切的方法就是:
2试一试……
您需要这样做来关闭Excel应用程序,因为它在后台打开Excel程序….
1 | app .Application.Quit(); |
在代码中添加上述行代码,方法如下:
1 2 3 4 | object misValue = System.Reflection.Missing.Value; workbook.Close(true, misValue, misValue); app .Application.Quit(); app.Quit(); |