正在卸载COM对象C#

本文关键字:对象 COM 卸载 | 更新日期: 2023-09-27 18:09:54

可能重复:
如何正确清理C#中的Excel互操作对象

我正在使用EXCEL INTEROP来读取我的EXCEL文件。NET应用程序。然而我看到,在完成它之后,我仍然看到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。

清理过程中还有什么遗漏吗?

提前感谢

正在卸载COM对象C#

"我正在执行的应用程序特定的某些进程…">

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

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

尝试使用Marshal.*Final*ReleaseComObject而不是ReleaseComObject。也可以在您的"ApplicationClass excel"实例中调用它。