【问题标题】:When does the .NET runtime hold a reference count > 1 for COM objects?.NET 运行时何时保持 COM 对象的引用计数 > 1?
【发布时间】:2011-02-03 18:21:51
【问题描述】:

直到最近,我还相信 .NET 运行时在创建 runtime-callable wrapper 时只会将 COM 对象的引用计数增加 1,并且只会为任何给定的 COM 对象创建一个这样的运行时可调用包装器。

如果我没记错的话,上面的意思是 Marshal.FinalReleaseComObjectMarshal.ReleaseComObject 在实践中做同样的事情。

但是,今天我正在编写一些测试来验证我的代码是否正确释放了 COM 对象。我通过调用应该释放的对象并检查预期的InvalidComObjectException 来做到这一点。 事实证明,在 FinalReleaseComObject 之后会抛出异常,但在 ReleaseComObject 之后不会抛出异常。

这是否意味着 .NET 2.0 运行时可以保存多个对 COM 对象的引用?如果是这样,它什么时候这样做?

【问题讨论】:

    标签: .net com com-interop rcw


    【解决方案1】:

    这里有一个额外的间接级别。是的,RCW 在本机 COM 接口指针上保留一个引用计数。但是 RCW 也有一个引用计数,每次 COM 接口指针映射到 RCW 时它都会增加。如果 COM 方法返回接口指针,可能会发生这种情况。对应的 .NET 包装类的终结器将其递减。

    您可以直接通过 Marshal.ReleaseComObject() 修改该引用计数,它像终结器一样将其减一,而 Marshal.FinalReleaseComObject() 将其归零,保证 IUnknown::Release()方法被调用。他们当然属于“更好地知道你在做什么”类别。弄错会产生丑陋且无法调试的“COM 对象与其底层 RCW 分离”异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2018-09-22
      • 2021-02-21
      • 2012-11-01
      • 1970-01-01
      相关资源
      最近更新 更多