【问题标题】:COM: Does the reference counter increase when I put a COM variable in a method?COM:当我将 COM 变量放入方法中时,引用计数器会增加吗?
【发布时间】:2020-01-14 04:42:45
【问题描述】:

目前我有幸编写 C# 代码从 Excel 文件中读取内容。我正在使用 Nuget Excel 互操作来完成此操作。

我尝试遵循这篇很棒的博文中给出的建议:https://www.add-in-express.com/creating-addins-blog/2013/11/05/release-excel-com-objects/

但即使将所有内容放入最后释放的变量中,当我开始访问单元格时(输入 Range),Excel 进程也不会死。

因此我的问题是:当我这样做时:

Application excel = new Application();
_toBeReleased.Add(excel);
DoStuff(excel);

...

void DoStuff(Application excel2)
{

...

excel2也需要释放吗?因为引用被赋予了byval 到方法中?

【问题讨论】:

标签: c# excel com


【解决方案1】:

我不认为将 COM 对象传递给另一个方法(在您的示例中为 excel2)会使您可能需要执行的任何形式的释放对象变得复杂。将类传递给方法会传递对对象的引用,只要您的方法同步运行,它就应该返回,而不会对 excel2 进行任何持久引用。

如果您等待的时间足够长,垃圾收集器很可能会运行并清除您正在运行的 Excel 实例。由于等待这将是一个问题,您可以强制它从您的代码中运行:

GC.Collect();
GC.WaitForPendingFinalizers();

在调用垃圾收集器之前,我之前曾调用Marshal.ReleaseComObject(excel),但我知道这实际上没有必要。

替代选项(仅支持 .xslx)

这不是您问题的直接答案,但如果您可以将开发限制为仅支持较新的 (2007 / 2010) .xlsx 格式 - 而不是较旧的 .xls 格式,那么您不需要使用完全直接 Excel。

有一个很棒的 NuGet 包,名为 EPPlus,它允许您直接创建或编辑 .xlsx 文件,而不依赖于 Excel 应用程序。

如果您必须支持较旧的 .xls 格式,我很感激这没有用。

【讨论】:

  • 您能否告诉我为什么这个答案被否决?如果我的回答有误,我很乐意学习新知识。
猜你喜欢
  • 2010-11-30
  • 2014-05-28
  • 1970-01-01
  • 1970-01-01
  • 2014-05-26
  • 2011-06-04
  • 1970-01-01
  • 2013-10-15
  • 2020-10-20
相关资源
最近更新 更多