我为Excel任务使用了一些对象,如工作簿,工作表,应用程序。在完成Excel之后,我尝试通过以下代码发布它们。毕竟,我仍然在任务管理器中看到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仍在任务管理器中:
答案 0 :(得分:4)
已经回答:
How do I properly clean up Excel interop objects?
基本上COM对象是非托管对象(duh),当它们超出范围时不会被释放。 System.Runtime.InteropServices.Marshal.ReleaseComObject()可以在它们最终确定之前(在垃圾收集器中)释放它们,但是你必须确保保留所有对象的引用: excelApp.Worksheets.Open()创建了两个对象:使用Open()方法打开的集合“Worksheets”和“Worksheet”。
答案 1 :(得分:2)
使用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()== "")
答案 2 :(得分:1)
我已经有一段时间了,因为我已经完成了Office Interop(我实际上是将它用于Outlook,但概念应该是相同的)。我能够完全释放所有东西的唯一方法就是这样做:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
试一试......
答案 3 :(得分:1)
这是一个我无法解决的问题。我之前已经看过所有这些答案,并且我已经实现了所有这些答案,但仍然没有关闭。我不得不用蛮力做事。我所做的是创建了一个BAT文件并从我的程序中运行它。这是文件的内容:
Taskkill /F /IM excel.exe
这将调用所有excel运行。如果你无法找到不同的解决方案,我会用这个。
答案 4 :(得分:0)
你需要关闭excel应用程序,因为它在后台打开excel程序....
app .Application.Quit();
以下列方式在代码中添加上述代码:
object misValue = System.Reflection.Missing.Value;
workbook.Close(true, misValue, misValue);
app .Application.Quit();
app.Quit();