[C#] COM - Objekte freigeben

Drucken
( 0 Votes ) 
Hauptkategorie: Programmieren Kategorie: C#
Erstellt am 03.05.2013 Zuletzt aktualisiert am 03.05.2013 Geschrieben von Jonny132
Da man in .NET die Möglichkeit hat, COM Objekte einzubinden bzw. dessen Schnittstellen anzuprogrammieren, ist es nötig diese Resourcen auch wieder korrekt freigeben zu können.

Bindet man eine COM Komponente bzw eine ActiveX Komponente in das Projekt ein, so werden vom RCW (Runtime Callable Wrapper) Verweise auf diese COM Objekte gespeichert.

Um diese COM-Verweise löschen zu können, bietet das .NET - Framework im Namespace System.Runtime.InteropServicesdie Statische Klasse Marshal an.
using System.Runtime.InteropServices;
Die Klasse Marshal enthält die Methode ReleaseComObject(), welcher wir unser COM - Objekt übergeben können.
Diese Methode löscht jedoch immer nur einen! Verweis  den die RCW gespeichert hat.
Enthält die RCW mehrere Verweise auf das gleiche Objekt, bleibt das Objekt bzw. die abhängigkeit davon immer noch bestehen.
        Marshal.ReleaseComObject(comObject);
   
Um alle Verweise auf ein COM - Objekt zu löschen, kann per While-Schleife die Methode ReleaseComObjekt() solange aufgerufen werden, bis ihr Rückgabewert 0 (null) ist.
Eine andere Möglichkeit alles Verweise zu löschen, ist die Methode FinalReleaseComObject() aufzurufen, welche intern jedoch nichts anderes macht also Version 1.

Alle Verweise auf ein COM - Objekt löschen:
        // Version 1
        while (Marshal.ReleaseComObject(comObject) != 0)
        {

        }

        // Version 2
        Marshal.FinalReleaseComObject(comObject);

Vollständiges Beispiel mit der Verwendung von COM - Objekten:
      ComObjektKlasse comObject = null;
      try
      {
        comObject = new ComObjektKlasse();
      }
      finally
      {
        if (comObject != null)
        {
          Marshal.FinalReleaseComObject(comObject);
          comObject = null;
        }
      }




    Veröffentlichen Sie ihre Kommentare ...