2012-09-18 13 views
7

Tengo un objeto COM dynamic como campo privado en mi clase. No estoy seguro de si se considera recurso administrado (GC lo limpia) o no.¿Los objetos COM dinámicos se consideran recursos administrados?

private dynamic _comConnector = null; 

...

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

Al implementar IDispose, debería limpiarlo como un recurso gestionado (sólo cuando Dispose() se llama explícitamente), o como un recurso nativo (cuando Desechar (falso) se llama desde el finalizador también)?

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

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

    // Free unmanaged resources // 

    // --> Or maybe here? 
} 
+0

Sí, GC lo limpia. No implementa IDisposable por lo que no hay nada que desechar. –

+0

Tengo aquí después de googlear 'es Activator.CreateInstance administrado o no administrado' ... y estaba buscando a causa de Dispose. –

Respuesta

6

Es un recurso administrado (básicamente un Contenedor invocable en tiempo de ejecución) y debe limpiarlo como tal. MSDN states that:

Cada RCW mantiene una caché de punteros de interfaz en el objeto COM que se envuelve y libera su referencia en el objeto COM cuando el RCW ya no es necesaria. El tiempo de ejecución realiza la recolección de basura en el RCW.

I.e. el RCW es un recurso administrado que envuelve las referencias COM no administradas.

Como un lado, la liberación de objetos COM puede ser peligrosa si los está usando desde múltiples hilos en múltiples lugares en su aplicación, como se describe en this blog post from Chris Brumme.

Si está utilizando un objeto COM de forma única y con un único subproceso, puede llamar a ReleaseComObject con seguridad en ese objeto cuando haya terminado con él: con suerte este es su caso.

0

1 COM es un componente por lo que todo depende de lo que haga. si cumple con las siguientes funcionalidades

  • Abrir archivos

  • abrir conexiones de red

  • memoria no administrada

  • En XNA: tampones de vértices, tampones índice, texturas, etc.

=> Así que sí se logró no ressource

del colector de basura no tienen información sobre este ressource, por lo que la limpieza es para el usuario

2 Para la limpieza, sólo se puede utilizar el método Dispose (O usando bloque; quien llama a disponer al final del tratamiento).

Cuestiones relacionadas