c# – 动态COM对象是否被视为托管资源?

我有一个动态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?
}

解决方法

它是一个托管资源(基本上是一个Runtime Callable Wrapper),你应该这样清理它. MSDN states that

Each RCW maintains a cache of interface pointers on the COM object it wraps and releases its reference on the COM object when the RCW is no longer needed. The runtime performs garbage collection on the RCW.

即RCW是一个托管非托管COM引用的托管资源.

另外,如果您在应用程序的多个位置使用多个线程,则释放COM对象可能会很危险,如this blog post from Chris Brumme中所述.

如果您以作用域,单线程方式使用COM对象,则可以在完成后对该对象安全地调用ReleaseComObject:希望这是您的情况.

相关文章

项目中经常遇到CSV文件的读写需求,其中的难点主要是CSV文件...
简介 本文的初衷是希望帮助那些有其它平台视觉算法开发经验的...
这篇文章主要简单记录一下C#项目的dll文件管理方法,以便后期...
在C#中的使用JSON序列化及反序列化时,推荐使用Json.NET——...
事件总线是对发布-订阅模式的一种实现,是一种集中式事件处理...
通用翻译API的HTTPS 地址为https://fanyi-api.baidu.com/api...