C# 如何正确处理互操作Excel应用程序和工作簿?

C# 如何正确处理互操作Excel应用程序和工作簿?,c#,C#,我正在使用Interop库读取/写入excel文件,如下所示 (更新:这不是的副本,问题是当出现异常时如何从内存中释放excel) 这可以正常工作,除非抛出异常,然后Excel在后台继续运行,并且必须使用任务管理器终止 我不确定释放这些COM对象的最佳方式是什么。我应该使用using块,还是应该像这样将所有内容都包含在try-catch中 Excel.Workbooks AllWorkbooks= null; Excel.Workbook MyWorkBook=null; Excel.Works

我正在使用Interop库读取/写入excel文件,如下所示

(更新:这不是的副本,问题是当出现异常时如何从内存中释放excel)

这可以正常工作,除非抛出异常,然后Excel在后台继续运行,并且必须使用任务管理器终止

我不确定释放这些COM对象的最佳方式是什么。我应该使用
using
块,还是应该像这样将所有内容都包含在try-catch中

Excel.Workbooks AllWorkbooks= null;
Excel.Workbook MyWorkBook=null;
Excel.Worksheet MyWorkshet=null;
Excel.Application myExcelApp=null;         
try{
//Read file here
}
catch{
    MyWorkBook?.Close(false, file);
    myExcelApp?.Quit();
    Marshal.FinalReleaseComObject(myExcelApp );
    //FInalReleaseComObject for MyWorkBooks
}
上述方法正确吗?我必须将excel对象初始化为null,因为它们无法更新


谢谢

有两种主要的思想流派。一个是你应该在每个对象上发布一个对象,这将是最有效的,但是更乏味。另一种思想是多次调用
GC.Collect
——如果调用得足够多,这会更简单,而且基本上是可靠的。你对哪所学校感兴趣(这样我可以选择最好的副本)?@mjwills我是OP。我可以为每个对象调用ReleaseComObject,但如果我上面的代码出现异常,excel似乎会在后台保留。如果没有例外,它会继续运行,因为您没有对所有内容调用
ReleaseComObject
。让它100%正常工作是一项艰巨的工作。如果你想要一个简单的答案(第二学校),那就去看看(我不同意这种方法,但它通常是有效的)。@vc74-注意规则2。
Excel.Workbooks AllWorkbooks= null;
Excel.Workbook MyWorkBook=null;
Excel.Worksheet MyWorkshet=null;
Excel.Application myExcelApp=null;         
try{
//Read file here
}
catch{
    MyWorkBook?.Close(false, file);
    myExcelApp?.Quit();
    Marshal.FinalReleaseComObject(myExcelApp );
    //FInalReleaseComObject for MyWorkBooks
}