卸载COM对象C#

时间:2011-09-27 11:23:59

标签: c# excel com-interop

  

可能重复:
  How to properly clean up Excel interop objects in C#

我正在使用EXCEL INTEROP在我的.NET应用程序中读取excel文件。但是我看到完成后,我仍然在Windows任务管理器中看到EXCEL.EXE。

代码如下:

ApplicationClass excel = new ApplicationClass();
Workbooks workBooks = excel.Workbooks;
Workbook workBook = workBooks.Open(fileName,0,true,5,"","",true,XLPlatform.xlWindows,"\t",false,false,0,true,1,0);


foreach (Name name in workBook.Names)
                {
                    try
                    {
                        // =#REF!#REF! indicates that the named range refers to nothing. Ignore these..
                        if (name.Value != "=#REF!#REF!")
                        {
                            if (!retNamedRanges.ContainsKey(name.Name))
                            {
                                string keyName = name.Name;
                                object value = name.RefersToRange.get_Value(missing);
                                retNamedRanges.Add(keyName, value);
                            }
                        }
                    }
                    catch (Exception ex)
                    {

                    }
                }



if(workBook!=null)
{
    workBook.Close(false,missing,missing);
}
if(workBook!=null)
{
    workBooks.Close();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workBooks);
workBook = null;
workBooks = null;
excel.Application.Quit();
excel.Quit();
excel = null;

我试图做所有可能的事情来清理,但它仍然没有。我需要阅读多个EXCEL文件。通常在我的应用程序执行后,我会看到EXCEL.EXE的多个实例。

清理还有什么遗漏吗?

非常感谢提前

2 个答案:

答案 0 :(得分:0)

“我正在做的某些特定于我的应用程序的过程......”

实际上,这很可能是问题所在。与引用的副本一样,如果引用ApplicationClass的属性,那么在垃圾收集器整理并删除Excel之前,您需要确保取消引用该属性。

因此,例如,将您需要的任何数据复制到stringint等(或基于这些基本类型的您自己的内部类型)。

答案 1 :(得分:0)

尝试使用Marshal.*Final*ReleaseComObject而不是ReleaseComObject。 也可以在“ApplicationClass excel”实例上调用它。