正在卸载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。
清理过程中还有什么遗漏吗?
提前感谢
"我正在执行的应用程序特定的某些进程…">
事实上,这很可能是问题所在。与引用的重复项一样,如果引用ApplicationClass
的属性,则需要确保在垃圾收集器整理并删除Excel之前取消引用该属性。
因此,例如,将您需要的任何数据复制到string
、int
等(或基于这些基本类型的您自己的内部类型(。
尝试使用Marshal.*Final*ReleaseComObject而不是ReleaseComObject。也可以在您的"ApplicationClass excel"实例中调用它。