2

我使用一些对象,如工作簿、工作表、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);

释放对象类:

    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 仍在任务管理器中: 在此处输入图像描述

4

5 回答 5

4

已经回答请看:

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

基本上 COM 对象是非托管对象 (duh),并且在超出范围时不会被释放。System.Runtime.InteropServices.Marshal.ReleaseComObject() 可用于在它们最终确定之前释放它们(在垃圾收集器中),但您必须确保保留所有对象的引用:excelApp.Worksheets.Open()创建两个对象:集合“Worksheets”和使用 Open() 方法打开的“Worksheet”。

于 2012-08-06T01:47:58.430 回答
2

使用进程从任务管理器中杀死 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()== "")
于 2012-10-26T10:37:59.717 回答
1

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

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

试一试....

于 2012-08-05T23:45:12.380 回答
1

这是我无法解决的问题。我以前看过所有这些答案,并且我已经实现了所有这些答案,但仍然 excel 没有关闭。我不得不用蛮力做事。我所做的是创建了一个 BAT 文件并从我的程序中运行它。这是文件的内容:

Taskkill /F /IM excel.exe

这将调用你所有的 Excel 运行。如果您无法找到不同的解决方案,我会使用它。

于 2012-08-06T01:58:10.933 回答
0

您需要通过这样做来关闭 excel 应用程序,因为它会在后台打开 excel 程序....

app .Application.Quit();

通过以下方式在您的代码中添加上述行代码:

    object misValue = System.Reflection.Missing.Value;
    workbook.Close(true, misValue, misValue);
    app .Application.Quit();
    app.Quit();
于 2012-08-05T23:07:21.093 回答