gpt4 book ai didi

c# - "COM object that has been separated from its underlying RCW cannot be used"?

转载 作者:行者123 更新时间:2023-11-30 18:00:19 32 4
gpt4 key购买 nike

我正在进行单元测试。

我的解决方案中有 2 个项目,1 个是库项目,1 个是测试项目。库项目有一些 com 组件。测试项目正在测试库项目中的功能。这些库函数正在使用这些 com 对象。

第一个单元测试执行成功,但是当我尝试依次执行 2 个单元测试时,然后在第二个单元测试中,当我尝试访问这些单元测试时出现错误“无法使用已与其底层 RCW 分离的 COM 对象” com 对象。

最佳答案

这意味着有人正在使用 Marshal.ReleaseComObject不正确,或者更糟的是,使用 Marshal.FinalReleaseComObject .第一个单元测试通过这种相关的副作用影响第二个单元测试,也许是在拆卸方法中。解决此问题的第一步是准确找出导致该异常的对象/访问/位置。

发生这种情况是因为在已释放 COM 对象(COM 引用计数设置为 0)的 RCW 上调用方法,这意味着 ReleaseComObject 已被调用太多次或 FinalReleaseComObject 已被调用。

如果您拥有一个 RCW 对象(已“将其带入 CLR”),并且它的生命周期已到,ReleaseComObject 没问题(将变量设置为 null 以及避免再次使用它)。使用 FinalReleaseComObject 通常永远不会成功,因为不可能正确地跟踪它的生命周期。诀窍是记住 一个 RCW 对象 表示一个 COM 对象被“带入 CLR”并具有内部(非 COM)对象的一次或多次柜台。

许多情况下,GC 将在其终结器运行时正确处理 RCW 清理。并且此时 RCW 不是强可达的,因此无法生成异常。使用显式 ReleaseComObject [仅] 在需要 严格控制 COM 生命周期的时候是必需的/有用的(想想“共享的” Dispose 对于 COM 对象)。在处理 Microsoft Office 产品的加载项开发时,这会产生很好的效果 :)

.NET and COM Interoperability : release COM from .NET client 中有更多详细信息(在我的回答中)和一篇反文章ReleaseComObject considered dangerous

快乐编码。

关于c# - "COM object that has been separated from its underlying RCW cannot be used"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10171017/

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