我正在使用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的多个实例。
清理还有什么遗漏吗?
非常感谢提前
答案 0 :(得分:0)
“我正在做的某些特定于我的应用程序的过程......”
实际上,这很可能是问题所在。与引用的副本一样,如果引用ApplicationClass
的属性,那么在垃圾收集器整理并删除Excel之前,您需要确保取消引用该属性。
因此,例如,将您需要的任何数据复制到string
,int
等(或基于这些基本类型的您自己的内部类型)。
答案 1 :(得分:0)
尝试使用Marshal.*Final*ReleaseComObject而不是ReleaseComObject。 也可以在“ApplicationClass excel”实例上调用它。