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

TX_*_*TX_ 7 c# com idisposable c#-4.0

我有一个dynamicCOM对象作为我班级的私人领域.我不确定它是否被视为托管资源(GC清理它).

private dynamic _comConnector = null;
Run Code Online (Sandbox Code Playgroud)

...

_comConnector = Activator.CreateInstance(Type.GetTypeFromProgID("SomeProgId"));
Run Code Online (Sandbox Code Playgroud)

在实现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?
}
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 6

它是一个托管资源(基本上是一个运行时可调用包装器),你应该这样清理它. MSDN声明:

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

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

另外,如果您在应用程序的多个位置使用多个线程,释放COM对象可能会很危险,如Chris Brumme的博客文章中所述.

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