在C#中发布Excel互操作对象的最佳做法是什么?

时间:2013-10-31 17:31:19

标签: c# excel interop

我的功能基本上是将excel文件转换为文本文件。结构如下。我最关心的是Last部分?杀死excel是最佳做法吗?

Excel.Application excel=new Excel.Application();
Excel.Workbook wb=excel.Workbooks.Open(…);

Try 
{
   …
   Foreach(Excel.Worksheet sheet in wb.Sheets)
   {
      …
      Marshal.RealseComObject(sheet);
   }
   …
}

Catch()
{
}

Finally
{
   wb.Close(false, missing, missing);
   while (Marshal.ReleaseComObject(wb)!=0)
   {
   }
   wb=null;
   excel.Quit();
   while (Marshal.ReleaseComObject(excel)!=0)
   {
   }
   excel=null;
   GC.Collect();
   GC.WaitForPendingFinalizers();
}

更新

我有以下版本的Last

Finally{
wb.close(false, missing, missing);
excel.application.quit();
excel.quit();

Marshal.ReleaseComObject(wb);
Marshal.ReleaseComObject(excel);
GC.Collect();
GC.WaitForPendingFinalizers();
}

哪一个更好(更有意义)?我已经检查了这里的所有链接,但没有最终答案,每个人的答案都是差别很大。我不确定哪一个最好?

1 个答案:

答案 0 :(得分:0)

最佳做法是在Marshal.ReleaseComObject(object name)个对象的所有上致电Marshal.FinalReleaseComObject(object name)COM。当然,根据项目的 size ,这可能会很快变得难以处理。您上面发布的代码应该可以在较小的范围内正常工作,如果您密切关注创建COM对象的时间/地点。我找到了一些进一步的阅读材料herehereherehere