C#.net Excel Interop离开Excel进程挂起

我们在代码中的很多地方使用Excel interop,但是我有一个函数似乎并没有关闭它使用的Excel进程..我已经简化了代码,它只是看起来像每当我打开一个工作簿在这个功能中它一直处于悬挂状态。 我已经包含了下面的代码,我确保每个对象都被定义,发布和清零,但Excel仍在运行。

        System.Data.DataTable dtExcelSheet = new System.Data.DataTable();
        Microsoft.Office.Interop.Excel.Application excelObject = new Microsoft.Office.Interop.Excel.Application();

        dtExcelSheet.Columns.Add("SheetName", typeof(string));
        dtExcelSheet.Columns["SheetName"].ReadOnly = false;
        dtExcelSheet.Columns["SheetName"].Caption = "Sheet Name";


        Workbooks wbs = excelObject.Workbooks;

        Workbook excelWorkbook = wbs.Add(excelFile);

        excelWorkbook.Close(false, System.Reflection.Missing.Value, System.Reflection.Missing.Value);
        wbs.Close();
        excelObject.Quit();

        int i1 = Marshal.FinalReleaseComObject(excelWorkbook);
        int i2 = Marshal.FinalReleaseComObject(wbs);
        int i3 = Marshal.FinalReleaseComObject(excelObject);


        excelWorkbook = null;
        wbs = null;
        excelObject = null;

        GC.GetTotalMemory(false);
        GC.Collect();
        GC.WaitForPendingFinalizers();
        GC.Collect();
        GC.GetTotalMemory(true);       

确保你没有在后台线程上调用Excel。 我有一个类似的问题,我正在清理所有的COM对象,但Excel仍然没有死去,结果是问题所在。

我在这里写下了我的经验和解决方案。


完整的猜测,但这一行:

dtExcelSheet.Columns.Add("SheetName", typeof(string));

返回创建的列?

如果是这样,你可能需要存储该参考,并在最后清理。

编辑:另外,我不认为你应该在最后设置变量为null,我认为只是再次访问它们。

你不应该告诉GC收集等,但我认为这可能是你的测试代码。


我已经用这些东西去了一段时间了,所以没有任何东西会跳出来。

在这些情况下,我通常会建议将您的Excel应用程序对象设置为Visible = true以查看是否没有对话框弹出。 无论你做什么,Excel / Word有时会拒绝关闭,如果他们认为有一个模式对话框打开。 无论如何,这是首先要检查的东西。

链接地址: http://www.djcxy.com/p/35649.html

上一篇: C# .net Excel Interop leaves Excel process hanging

下一篇: Using Wrapper objects to Properly clean up excel interop objects