2012-09-18 18 views
7

Ho un oggetto COM dynamic come campo privato nella mia classe. Non sono sicuro che sia considerato una risorsa gestita (GC lo pulisce) oppure no.Gli oggetti COM dinamici sono considerati risorse gestite?

private dynamic _comConnector = null; 

...

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

Nell'attuare IDispose, dovrei ripulirlo come una risorsa gestita (solo quando Dispose() viene chiamato in modo esplicito), o come risorsa nativa (quando Dispose (falso) viene chiamato anche dal finalizzatore)?

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 pulisce. Non implementa IDisposable quindi non c'è niente da smaltire. –

+0

Ottenuto qui dopo il googling 'è Activator.CreateInstance gestito o non gestito' ... e stavo cercando a causa di Dispose. –

risposta

6

È una risorsa gestita (fondamentalmente un Runtime Callable Wrapper) e dovresti pulirlo come tale. MSDN states that:

Ogni RCW mantiene una cache di puntatori di interfaccia per l'oggetto COM avvolge e rilascia il suo riferimento l'oggetto COM quando non è più necessario il RCW. Il runtime esegue la garbage collection su RCW.

I.e. RCW è una risorsa gestita che include i riferimenti COM non gestiti.

Come parte, il rilascio di oggetti COM può essere pericoloso se vengono utilizzati da più thread in più posizioni nell'applicazione, come descritto in this blog post from Chris Brumme.

Se si utilizza un oggetto COM in un ambito, con thread singolo, è possibile chiamare in modo sicuro ReleaseComObject su quell'oggetto al termine del processo: si spera che questo sia il tuo caso.

0

1 COM è un componente in modo che tutto dipenda da ciò che fa. se soddisfa le seguenti funzionalità

  • Aprire i file

  • connessioni di rete aperte

  • memoria non gestita

  • in XNA: buffer di vertice, buffer indice, texture, ecc

=> Quindi sì, è non è riuscito ressource

Garbage Collector non hanno informazioni su questa risorsa, in modo che il pulito è per l'utente

2 Per la pulizia, si può semplicemente utilizzare il metodo Dispose (o utilizzando in blocco; chi chiama cedere alla fine del trattamento).

Problemi correlati