2012-09-18 12 views
7

Ich habe ein COM-Objekt dynamic als ein privates Feld in meiner Klasse. Ich bin mir nicht sicher, ob es sich um verwaltete Ressourcen handelt (GC räumt auf) oder nicht.Werden dynamische COM-Objekte als verwaltete Ressourcen betrachtet?

private dynamic _comConnector = null; 

...

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

Wenn IDispose Umsetzung reinige ich es oben als verwaltete Ressource (nur wenn Dispose() explizit genannt wird), oder als native Ressource (wenn Dispose (false) wird auch vom Finalizer aufgerufen)?

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

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

    // Free unmanaged resources // 

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

Ja, GC räumt auf. Es implementiert IDisposable nicht, also gibt es nichts zu beseitigen. –

+0

Nach dem googlen hier ist "Activator.CreateInstance verwaltet oder unmanaged" ... und ich suchte wegen Dispose. –

Antwort

6

Es ist eine verwaltete Ressource (im Grunde ein Runtime Callable Wrapper) und Sie sollten es als solches aufräumen. MSDN states that:

Jeder RCW einen Cache des Schnittstellenzeigers auf dem COM-Objekt nicht mehr benötigt wird es wickelt und gibt seine Referenz auf dem COM-Objekt hält, wenn das RCW. Die Laufzeitumgebung führt eine Speicherbereinigung auf dem RCW durch.

I.e. Die RCW ist eine verwaltete Ressource, die die nicht verwalteten COM-Referenzen umschließt.

Nebenbei kann das Freigeben von COM-Objekten gefährlich sein, wenn Sie sie aus mehreren Threads an mehreren Stellen in Ihrer Anwendung verwenden, wie in this blog post from Chris Brumme beschrieben.

Wenn Sie ein COM-Objekt in einem Bereich mit einem einzigen Thread verwenden, können Sie ReleaseComObject für dieses Objekt sicher aufrufen, wenn Sie damit fertig sind: hoffentlich ist dies der Fall.

0

1 COM ist eine Komponente, also hängt alles davon ab, was er tut. wenn es erfüllt folgende Funktionalitäten

  • Dateien öffnen

  • Offene Netzwerkverbindungen

  • Unmanaged Speicher

  • In XNA: Vertex-Puffer, Index-Puffer, Texturen usw.

=> Also ja, es ist nicht ressource verwaltet

Garbage Collector keine Informationen haben über diese Ressource, so dass die sauber ist für Benutzer

2 Für die saubere, einfach Dispose Methode verwenden (Oder mit bloc; Wer am Ende der Behandlung anruft).

Verwandte Themen