【问题标题】:Can I call Marshall.ReleaseComObject in a Finalizer?我可以在终结器中调用 Marshall.ReleaseComObject 吗?
【发布时间】:2016-10-18 07:02:34
【问题描述】:

我在我们的代码库中发现了这样的代码:

if (disposing)
{
    ....
}
Marshal.ReleaseComObject(comObject)

由于 comObject 实际上是一个 .Net 对象(一个 RCW,对吗?)从 Finalizer 调用它是否安全?

有没有可能已经发布了?

【问题讨论】:

  • 不,这不安全,RCW 已经有自己的终结器。首先,这使得代码完全没有必要。更严重的是,由于完成顺序不是确定性的,您可能会在已销毁的对象上调用 ReleaseComObject()。
  • 谢谢,如果您将其作为答案,我会将其标记为解决方案。
  • 您确定可以发布更好的答案吗?我不知道当你在一个被破坏的对象上调用 ReleaseComObject() 时会发生什么,我从来没有故意弄错这个。
  • @HansPassant:对不起,我没听懂。我只是要求将评论移至答案,以便我可以将其标记为已接受的答案,因为我无法在评论中执行此操作。

标签: c# .net dispose finalizer


【解决方案1】:

正如Hans Passant所说:

不,这不安全,RCW 已经有自己的终结器。哪个 首先使代码完全没有必要。更严重的是, 因为完成顺序不是确定性的,你可能会打电话 ReleaseComObject() 在已经销毁的对象上

所以调用必须在 if (disposing) 内。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2019-10-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    相关资源
    最近更新 更多