【问题标题】:Are dynamic COM objects considered managed resources?动态 COM 对象是否被视为托管资源?
【发布时间】:2012-09-18 16:11:10
【问题描述】:

我的班级中有一个dynamic COM 对象作为私有字段。我不确定它是否被视为托管资源(GC 清理它)。

private dynamic _comConnector = null;

...

_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));

在实现 IDispose 时,我应该将其作为托管资源(仅在显式调用 Dispose() 时)还是作为本机资源(当也从终结器调用 Dispose(false) 时)清理?

private void Dispose(bool disposing)
{
    if (disposing)
    {
        // Free managed resources //

        // --> Should I call Marshal.FinalReleaseComObject(_comConnector) here?
    }

    // Free unmanaged resources //

    // --> Or maybe here?
}

【问题讨论】:

  • 是的,GC 会清理它。它没有实现 IDisposable 所以没有什么可以处理的。
  • 在谷歌搜索 is Activator.CreateInstance managed or unmanaged... 后到达这里,因为 Dispose。

标签: c# c#-4.0 com idisposable


【解决方案1】:

它是一个托管资源(基本上是一个运行时可调用包装器),您应该这样清理它。 MSDN states that:

每个 RCW 在其包装的 COM 对象上维护一个接口指针缓存,并在不再需要 RCW 时释放其对 COM 对象的引用。运行时在 RCW 上执行垃圾回收。

即RCW 是包装非托管 COM 引用的托管资源。

顺便说一句,如果您在应用程序的多个位置从多个线程使用它们,释放 COM 对象可能会很危险,如 this blog post from Chris Brumme 中所述。

如果您以范围内的单线程方式使用 COM 对象,那么您可以在完成后安全地调用该对象的 ReleaseComObject:希望这是您的情况。

【讨论】:

    【解决方案2】:

    1 COM 是一个组件,所以这一切都取决于他做什么。如果它满足以下功能

    • 打开文件

    • 打开网络连接

    • 非托管内存

    • 在 XNA 中:顶点缓冲区、索引缓冲区、纹理等

    => 所以是的,它是非托管资源

    垃圾收集器没有关于这个资源的信息,所以清理是给用户的

    2 对于清理,你可以只使用Dispose 方法(或使用 bloc;在处理结束时调用 dispose)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-09-23
      • 2011-03-26
      • 1970-01-01
      相关资源
      最近更新 更多