Share via


Marshal.ReleaseComObject(Object) Methode

Definition

Verringert den Verweiszähler des dem angegebenen COM-Objekt zugeordneten Runtime Callable Wrapper (RCW).

public:
 static int ReleaseComObject(System::Object ^ o);
[System.Security.SecurityCritical]
public static int ReleaseComObject (object o);
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
public static int ReleaseComObject (object o);
public static int ReleaseComObject (object o);
[<System.Security.SecurityCritical>]
static member ReleaseComObject : obj -> int
[<System.Runtime.Versioning.SupportedOSPlatform("windows")>]
static member ReleaseComObject : obj -> int
static member ReleaseComObject : obj -> int
Public Shared Function ReleaseComObject (o As Object) As Integer

Parameter

o
Object

Das freizugebende COM-Objekt.

Gibt zurück

Der neue Wert für den Verweiszähler des RCW, der o zugeordnet ist. Dieser Wert ist in der Regel 0, da der RCW unabhängig von der Anzahl der aufrufenden verwalteten Clients genau einen Verweis auf das umschlossene COM-Objekt beibehält.

Attribute

Ausnahmen

o ist kein gültiges COM-Objekt.

Hinweise

Diese Methode wird verwendet, um die Lebensdauer eines COM-Objekts, das aus verwaltetem Code verwendet wird, explizit zu steuern. Sie sollten diese Methode verwenden, um das zugrunde liegende COM-Objekt, das Verweise auf Ressourcen enthält, rechtzeitig freizugeben, oder wenn Objekte in einer bestimmten Reihenfolge freigegeben werden müssen.

Jedes Mal, wenn ein COM-Schnittstellenzeiger in die Common Language Runtime (CLR) eintritt, wird er in einen RCW umschlossen.

Der RCW verfügt über eine Verweisanzahl, die jedes Mal erhöht wird, wenn ein COM-Schnittstellenzeiger diesem zugeordnet wird. Die ReleaseComObject -Methode dekrementiert die Verweisanzahl eines RCW. Wenn die Verweisanzahl 0 erreicht, gibt die Runtime alle ihre Verweise auf das nicht verwaltete COM-Objekt frei und löst einen aus System.NullReferenceException , wenn Sie versuchen, das Objekt weiter zu verwenden. Wenn dieselbe COM-Schnittstelle mehrmals von nicht verwaltetem Code an verwalteten Code übergeben wird, wird die Verweisanzahl im Wrapper jedes Mal erhöht, und beim Aufrufen ReleaseComObject wird die Anzahl der verbleibenden Verweise zurückgegeben.

Mit dieser Methode können Sie eine RCW-Verweisanzahl-Freigabe erzwingen, sodass sie genau dann erfolgt, wenn dies gewünscht ist. Eine unsachgemäße Verwendung von ReleaseComObject kann jedoch dazu führen, dass Ihre Anwendung fehlschlägt oder eine Zugriffsverletzung verursacht.

Stellen Sie sich ein Szenario vor, in dem verwalteter Code in einer Anwendungsdomäne an einem RCW festgehalten wird, der eine COM-Komponente darstellt. Wenn Sie die ReleaseComObject -Methode auf dem RCW aufrufen, kann der verwaltete Code nicht auf den RCW zugreifen und eine InvalidComObjectException Ausnahme auslösen.

Ein schwerwiegenderer Fehler kann auftreten, wenn ein Aufruf des RCW ausgeführt wird, wenn die RCW freigegeben wird. In diesem Fall besteht eine gute Wahrscheinlichkeit, dass der Thread, der den Aufruf ausrichtt, eine Zugriffsverletzung verursacht. Der Prozessspeicher kann jedoch beschädigt werden, und der Prozess kann weiterhin ausgeführt werden, bis er aus Gründen fehlschlägt, die sehr schwierig zu debuggen sind.

Dieses Risiko wird verschlimmert, wenn es sich bei der verwendeten COM-Komponente um einen Singleton handelt, aus folgendem Grund: Die CLR aktiviert COM-Komponenten durch Aufrufen der COM-CoCreateInstance-Funktion , die bei jedem Aufruf für Singleton-COM-Komponenten denselben Schnittstellenzeiger zurückgibt. Daher können separate und unabhängige Teile des verwalteten Codes in einer Anwendungsdomäne denselben RCW für eine Singleton-COM-Komponente verwenden, und wenn einer die Methode für die ReleaseComObject COM-Komponente aufruft, wird die andere unterbrochen.

Verwenden Sie daher nur, ReleaseComObject wenn es unbedingt erforderlich ist. Wenn Sie diese Methode aufrufen möchten, um sicherzustellen, dass eine COM-Komponente zu einem bestimmten Zeitpunkt freigegeben wird, sollten Sie stattdessen die FinalReleaseComObject -Methode verwenden. FinalReleaseComObject gibt die zugrunde liegende COM-Komponente frei, unabhängig davon, wie oft sie erneut in die CLR gelangt ist. Die interne Referenzanzahl des RCW wird jedes Mal um eins erhöht, wenn die COM-Komponente erneut in die CLR eintritt. Daher können Sie die ReleaseComObject -Methode in einer Schleife aufrufen, bis der zurückgegebene Wert 0 ist. Dadurch wird das gleiche Ergebnis wie die FinalReleaseComObject -Methode erzielt.

Gilt für:

Weitere Informationen