【问题标题】:What is the best practise to relase Excel interop objects in C#? [duplicate]在 C# 中发布 Excel 互操作对象的最佳实践是什么? [复制]
【发布时间】:2013-11-11 20:18:46
【问题描述】:

我基本上有一个将excel文件转换为文本文件的功能。结构如下。我担心的是最后的部分?杀死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();
}

更新:

我有以下版本的 finally

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

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

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

【问题讨论】:

标签: c# excel interop


【解决方案1】:

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

【讨论】:

  • 我需要重新发布 excel.worksheet 吗?由于我在 foreach 循环中看到了一些不释放工作表的示例
  • @GLP - 你技术上不必全部释放它们,不。但是,如果您要处理大量此类问题,那么您真的应该。它们被视为“非托管”,就像 interop 程序集中的所有内容一样。
  • 所以我想我应该释放工作表对象。但是在 foreach 循环中,我无法在 Marshal.RealseComObject(sheet) 之后设置 sheet=null。这是否意味着我不应该使用 foreach?或者我可以创建一个类似 private void NAR(object o) { try { while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) 的函数; } 捕捉 { } 最后 { o = null;然后我可以间接将工作表对象设置为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
相关资源
最近更新 更多