gpt4 book ai didi

c# - COM:当我将 COM 变量放入方法中时,引用计数器会增加吗?

转载 作者:太空宇宙 更新时间:2023-11-03 16:58:31 24 4
gpt4 key购买 nike

目前我不幸编写了 C# 代码来从 Excel 文件中读取内容。我正在使用 Nuget Excel Interop 来完成此任务。

我尝试遵循这篇很棒的博客文章中给出的建议: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 赋给了方法?

最佳答案

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

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

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

我之前在调用垃圾收集器之前调用了 Marshal.ReleaseComObject(excel),但我知道这实际上不是必需的。

替代选项(仅支持 .xslx)

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

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

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

关于c# - COM:当我将 COM 变量放入方法中时,引用计数器会增加吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57904423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com