Freigeben über


Marshal.ReleaseComObject(Object) Methode

Definition

Erhöht die Referenzanzahl des Runtime Callable Wrapper (RCW), der dem angegebenen COM-Objekt zugeordnet ist.

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 com-Objekt, das freigegeben werden soll.

Gibt zurück

Der neue Wert der Bezugsanzahl der RCW zugeordnet o. Dieser Wert ist in der Regel null, da der RCW nur einen Verweis auf das umbrochene COM-Objekt behält, unabhängig von der Anzahl der verwalteten Clients, die es aufrufen.

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. Verwenden Sie diese Methode, um das zugrunde liegende COM-Objekt freizugeben, das Verweise auf Ressourcen zeitnah enthält oder wenn Objekte in einer bestimmten Reihenfolge freigegeben werden müssen.

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

Der RCW verfügt über eine Referenzanzahl, die bei jeder Zuordnung eines COM-Schnittstellenzeigers erhöht wird. Die ReleaseComObject Methode erhöht die Referenzanzahl einer RCW. Wenn die Referenzanzahl null erreicht, gibt die Laufzeit alle zugehörigen Verweise auf das nicht verwaltete COM-Objekt frei und löst ein 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 für den Wrapper jedes Mal erhöht, und der Aufruf ReleaseComObject gibt die Anzahl der verbleibenden Verweise zurück.

Mit dieser Methode können Sie eine RCW-Referenzanzahlsfreigabe erzwingen, sodass sie genau bei Bedarf auftritt. Die nicht ordnungsgemäße Verwendung kann ReleaseComObject jedoch dazu führen, dass Ihre Anwendung fehlschlägt oder eine Zugriffsverletzung verursacht.

Betrachten Sie ein Szenario, in dem verwalteter Code in einer Anwendungsdomäne eine RCW-Komponente darstellt, die eine COM-Komponente darstellt. Wenn Sie die ReleaseComObject Methode für rcW aufrufen, kann der verwaltete Code nicht auf rcW zugreifen und löst eine InvalidComObjectException Ausnahme aus.

Ein schwerwiegenderer Fehler kann auftreten, wenn ein Aufruf des RCW ausgeführt wird, wenn der RCW losgelassen wird. In diesem Fall besteht eine gute Chance, dass der Thread, der den Anruf aufruft, zu einer Zugriffsverletzung führt. 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 verbunden, wenn die verwendete COM-Komponente ein Singleton ist, aus dem folgenden Grund: Die CLR aktiviert COM-Komponenten durch Aufrufen der COM CoCreateInstance-Funktion , die denselben Schnittstellenzeiger jedes Mal zurückgibt, wenn sie für Singleton-COM-Komponenten aufgerufen wird. Daher können separate und unabhängige Teile von verwaltetem Code in einer Anwendungsdomäne den gleichen RCW für eine Singleton-COM-Komponente verwenden, und wenn eine der Beiden die Methode für die ReleaseComObject COM-Komponente aufruft, wird die andere unterbrochen.

Verwenden Sie daher die ReleaseComObject einzige, wenn sie 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 Verwendung der FinalReleaseComObject Methode in Betracht ziehen. FinalReleaseComObject gibt die zugrunde liegende COM-Komponente unabhängig davon frei, wie oft sie erneut in die CLR eingegeben wurde. Die interne Referenzanzahl des RCW wird jedes Mal erhöht, wenn die COM-Komponente die CLR erneut eingibt. Daher könnten Sie die ReleaseComObject Methode in einer Schleife aufrufen, bis der zurückgegebene Wert null ist. Dies erreicht dasselbe Ergebnis wie die FinalReleaseComObject Methode.

Gilt für:

Weitere Informationen