应按什么顺序释放 COM 对象和垃圾收集?

2024-03-02

关于释放 COM 对象和垃圾收集,有很多问题,但我找不到专门解决这个问题的东西。

当释放 COM 对象(在本例中具体为 Excel Interop)时,我应该按什么顺序释放引用并调用垃圾回收?

在某些地方(例如here https://stackoverflow.com/a/1893653/976080)我见过这个:

Marshall.FinalReleaseComObject(obj);
GC.Collect();
GC.WaitForPendingFinalizers();

而在其他方面(例如here https://stackoverflow.com/a/159419/976080) this:

GC.Collect();
GC.WaitForPendingFinalizers();
Marshall.FinalReleaseComObject(obj);

或者这并不重要,我什么也不担心?


Marshal.FinalReleaseComObject() 释放底层 COM 接口指针。

GC.Collect() 和 GC.WaitForPendingFinalizers() 导致调用 COM 包装器的终结器,该终结器调用 FinalReleaseComObject()。

所以没有意义的是去做both方法。选择其中之一。

显式调用 FinalReleaseComObject() 的麻烦在于,它仅在您调用它时才起作用all接口指针。如果您只错过其中一个,Office 程序将继续运行。那是very很容易做到,特别是 C# 版本 4 中允许的语法糖使其成为可能。像这样的表达range = sheet.Cells[1, 1],在 Excel 互操作代码中非常常见。那里有一个隐藏的 Range 接口引用,您永远不会显式地将其存储在任何地方。所以你也不能释放它。

这不是 GC.Collect() 的问题,它可以看到它们。然而,它也并非完全没有问题,只有当您的程序不再引用该接口时,它才会收集并运行终结器。这绝对是你的第二个片段的问题所在。当您调试程序时,往往会出错,调试器将本地对象引用的生命周期延长到方法的末尾。还有你看着Taskmgr并大喊“该死的!”的时候。

GC.Collect() 的通常建议也适用于此。保持程序运行并执行工作。正常情况下,您将触发垃圾收集并释放 COM 包装器。 Office 程序将退出。它只是不会立即发生,它最终会发生。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应按什么顺序释放 COM 对象和垃圾收集? 的相关文章

  • 多个源的 makefile

    在学习 make 文件时 我试图为多个源目录编写一个 make 文件 似乎我在某个地方错了 这是我的代码结构 directory common fun2 c inc fun h src fun1 c main c 这是我的生成文件 CC c
  • CMake 找不到请求的 Boost 库

    既然我已经浏览了其他人的解决方案几个小时 但找不到适合我的问题的正确答案 我想将我的具体问题带给您 我正在尝试使用 CMake 构建 vsomeip 为此 我之前构建了 boost 1 55 但是 我在 CMake 中收到以下错误 The
  • 您可以从基本 Win32 控制台模板应用程序中的 C#/Winrt 组件调用(不是 WinForm/abstractions/wrappers 或使用 C++/Winrt 模板)吗?)

    我有一个现有的程序 win32 x86 控制台应用程序 需要调用托管代码 来自 Net 的 C dll The dll不暴露给 COM 但可以从 C WinRT 组件调用并由 C WinRT 控制台模板应用引用 BUT即使安装了 C Win
  • 在现代 C++ 中,临时生命周期延长何时有用?

    在 C 中 您可以将函数的返回值 返回值 而不是引用 绑定到 const 引用 并且代码仍然有效 因为该临时对象的生命周期将延长到作用域末尾 例如 std string get string return abc void f const
  • 在 C# 中调用 C++ 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有很多用 C 编写的库 我想从 C 调用这些库 但是 我遇到了很多问题 我想知道是否有书籍或指南告诉我如何做到这一点 Dll导入 htt
  • 如何使用 SOAP 且不使用 WSE 在 .NET 中签署 Amazon Web 服务请求

    亚马逊产品广告 API 以前称为 Amazon Associates Web Service 或 Amazon AWS 实施了一项新规则 即自 2009 年 8 月 15 日起 向其发送的所有 Web 服务请求都必须经过签名 他们在其网站上
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • C# 开源 NMEA 解析器 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找 C 开源 NMEA 解析器 嗯 我自己也不熟悉 但是一些快速搜索显示了一个代码项目 htt
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • C# 编译器不会优化不必要的强制转换

    前几天 在写答案的时候这个问题 https stackoverflow com questions 2208315 why is any slower than contains在这里 关于溢出 我对 C 编译器感到有点惊讶 它没有按照我的
  • 搜索实体的所有字段

    我正在尝试在客户数据库上实现 多功能框 类型的搜索 其中单个查询应尝试匹配客户的任何属性 这是一些示例数据来说明我想要实现的目标 FirstName LastName PhoneNumber ZipCode Mary Jane 12345
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 从BackgroundWorker线程更新图像UI属性

    在我正在编写的 WPF 应用程序中 我有一个 TransformedBitmap 属性 该属性绑定到 UI 上的 Image 对象 每当我更改此属性时 图像就会更新 因此显示在屏幕上的图像也会更新 为了防止在检索下一张图像时 UI 冻结或变
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T

随机推荐

  • ConcurrentQueue 保存对象的引用或值? “内存不足”异常

    排队到 ConcurrentQueue 的对象是被复制到队列还是仅复制到它们的引用 我不明白任何场景 解释 我这样定义了一个 ConcurrentQueue BufferElement is a class I created privat
  • 可观察队列?

    是否有人编写了实现 INotifyCollectionChanged 的 Net 通用队列版本 或者是否已经在 Net 框架深处隐藏了某个版本 快速搜索没有显示任何结果 但接口很简单 扩展 Queue 类并添加对该接口的支持几乎是微不足道的
  • Dropbox SDK 401 错误

    我正在使用 Dropbox SDK 并且已将其设置为应用程序只能访问 Apps MyAPP 文件夹 我正在测试它并在线删除了该文件夹 现在 当我在应用程序中而不是要求重新链接 Dropbox 时 它会给我一个 401 错误 我不知道为什么它
  • Docker 在构建期间不会创建目录

    第一次尝试使用 Docker 在我的 Dockerfile 中执行以下步骤来创建目录 但是当我运行容器时 该目录不存在 FROM ubuntu MAINTAINER AfterWorkGuinness RUN apt get update
  • actix-web 中“扩展”的作用是什么?

    我想弄清楚如何Extension https docs rs actix web 3 3 2 actix web dev struct Extensions htmls 创建于Actix 网络 https crates io crates
  • 无法将焦点设置在 Windows 窗体文本框上

    当选项卡页首次出现时 我似乎无法在文本框中获得输入焦点 我正在使用 Windows 窗体 VB NET 3 5 我在选项卡页的面板上有一个文本框 我希望当选项卡页出现时焦点位于文本框上 我希望用户能够立即开始在聚焦的文本框中键入内容 而无需
  • 如何在 iOS 中更改 ePub 图书的字体颜色和字体样式?

    我创建了支持 pdf 和 ePub 格式的书籍应用程序 在该应用程序中 pdf 仅显示为图像 而 ePub 在 Web 视图中打开 因为 EPUB 只是存储在带有 XML 清单的 zip 文件中的 XHTML 现在 我想改变字体样式 and
  • django 中 settings.py 中的密钥中的“Django-insecure”

    创建新项目后django admin startproject my settings py包含 SECRET KEY django insecure
  • 当 Task.Status 更改为正在运行时,有没有办法收到通知?

    我正在编写一个运行任务并基于通知的类this https msdn microsoft com en us magazine dn605875 aspx 我想不出解决方案的一个问题是如何在 Task Status 离开时发出通知TaskSt
  • 如何在Java、SQL、ORM中使用money数据类型

    在 Java 应用程序中使用货币数据类型的最佳实践是什么 钱应该是双变量吗 四舍五入 货币等又如何呢 有专门的图书馆吗 最流行数据库中的 ORM 和 SQL 又如何呢 据我所知 并非所有 SQL 引擎中都是 Money 数据类型 在这种情况
  • 如果值为负数,如何更改文本颜色?

    我正在开发一个网络应用程序 它可以在整数之间进行加法 我有两个函数叫做num1 and num2 获取两个整数作为用户的输入 如果两个整数之和为负数 我想更改结果输出文本颜色 我如何使用 JavaScript 来做到这一点 我看过很多 jQ
  • Spring MVC: 标签之间的区别? [复制]

    这个问题在这里已经有答案了 前几天开始研究这个Spring Hello World教程 http viralpatel net blogs spring 3 mvc create hello world application spring
  • CSS渐变棋盘图案

    I want to create a checkerboard pattern using gradients I ve found an example and modified it to my needs however it onl
  • 如何在 Mac 上通过终端访问 XAMPP/Lampp 文件夹

    我最近开始在 Mac 上使用 XAMPP 它在 共享 下安装了 lampp 文件夹 并在 Finder 中显示为 IP 地址 因此 我可以通过 Finder 访问这些文件 但无法通过终端 cd 进入该文件夹 共享文件夹根本不可见 我尝试 V
  • 无法通过 docker-letsencrypt-nginx-proxy-companion 启用 ssl

    我想通过以下方式启用 ssldocker letsencrypt nginx proxy companion 这是 docker compose yml version 3 3 services nginx proxy image jwil
  • 返回选定的指定列

    我想从某个 Blob 表中仅选择几列 我有以下字段 Id RowVersion Size Signature Blob 我只想选择前四个 我这样做 gt 是一个错误的地方 public List
  • 从 http 而不是 https 加载图像时出现 403 错误

    我的问题类似于this one https stackoverflow com questions 22958559 403 when trying to download a remote image 但我只使用 html 和 javas
  • 打乱 SSE 寄存器中的偶数和奇数值

    我用 16 位值加载两个 SSE 128 位寄存器 这些值按以下顺序排列 src 0 E 3 O 3 E 2 O 2 E 1 O 1 E 0 O 0 src 1 E 7 O 7 E 6 O 6 E 5 O 5 E 4 O 4 我想要实现的是
  • 如何从 Xcode 的代码补全中排除某些术语? (自动完成、内容辅助)

    众所周知 Xcode 的代码补全功能非常棒 同时也是必要的 但有时它也可能很烦人 有什么方法可以修改可能的完成结果列表吗 例如 我一直在使用 CGSizeMake 但从来不想使用首先建议的 CGSizeMakeWithDictionaryR
  • 应按什么顺序释放 COM 对象和垃圾收集?

    关于释放 COM 对象和垃圾收集 有很多问题 但我找不到专门解决这个问题的东西 当释放 COM 对象 在本例中具体为 Excel Interop 时 我应该按什么顺序释放引用并调用垃圾回收 在某些地方 例如here https stacko