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

时间:2012-08-05 22:54:46

标签: c# excel

我为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仍在任务管理器中: enter image description here

5 个答案:

答案 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();