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

Int32

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 explizit zu steuern, das aus verwaltetem Code verwendet wird. Sie sollten diese Methode verwenden, um das zugrunde liegende COM-Objekt freizugeben, das Verweise auf Ressourcen zeitgerecht enthält oder wenn Objekte in einer bestimmten Reihenfolge freizugeben sein müssen.

Jedes Mal, wenn ein COM-Schnittstellenzeiger die allgemeine Sprachlaufzeit (CLR) eingibt, wird er in ein RCW umgebrochen.

Der RCW verfügt über eine Referenzanzahl, die jedes Mal erhöht wird, wenn ein COM-Schnittstellenzeiger darauf zugeordnet wird. Die ReleaseComObject Methode dekrementiert die Referenzanzahl einer RCW. Wenn die Referenzanzahl null erreicht, gibt die Laufzeit alle Verweise auf das nicht verwaltete COM-Objekt frei und löst eine System.NullReferenceException wenn Sie versuchen, das Objekt weiter zu verwenden. Wenn die gleiche COM-Schnittstelle mehr als einmal von nicht verwaltetem Code übergeben wird, wird die Referenzanzahl des Wrappers jedes Mal erhöht, und das Aufrufen ReleaseComObject gibt die Anzahl der verbleibenden Verweise zurück.

Diese Methode ermöglicht es Ihnen, eine RCW-Referenzanzahlsfreigabe zu erzwingen, sodass sie genau bei Bedarf auftritt. Die falsche Verwendung ReleaseComObject kann jedoch dazu führen, dass Ihre Anwendung fehlschlägt oder eine Zugriffsverletzung verursacht.

Berücksichtigen Sie ein Szenario, in dem verwalteter Code in einer Anwendungsdomäne an einem RCW gehalten wird, das eine COM-Komponente darstellt. Wenn Sie die Methode auf dem RCW aufrufen, kann der ReleaseComObject verwaltete Code nicht auf das RCW zugreifen und eine InvalidComObjectException Ausnahme auslösen.

Ein schwerwiegenderer Fehler kann auftreten, wenn ein Aufruf des RCW ausgeführt wird, wenn der RCW veröffentlicht wird. In diesem Fall gibt es eine gute Chance, dass der Thread, der den Anruf macht, zu einer Zugriffsverletzung führt. Der Prozessspeicher kann jedoch beschädigt werden, und der Prozess kann weiterhin ausgeführt werden, bis es aus Gründen fehlschlägt, die sehr schwierig zu debuggen sind.

Dieses Risiko wird zusammengesetzt, wenn die COM-Komponente, die verwendet wird, ein Singleton ist, aus folgendem Grund: Der CLR aktiviert COM-Komponenten durch Aufrufen der COM CoCreateInstance-Funktion , die jedes Mal denselben Schnittstellenzeiger zurückgibt, wenn er für Singleton-COM-Komponenten aufgerufen wird. Daher können separate und unabhängige Teile von verwaltetem Code in einer Anwendungsdomäne dieselbe RCW für eine Singleton-COM-Komponente verwenden, und wenn entweder die Methode auf der COM-Komponente aufgerufen ReleaseComObject wird, wird die andere unterbrochen.

Verwenden Sie daher nur, ReleaseComObject wenn sie absolut erforderlich ist. Wenn Sie diese Methode aufrufen möchten, um sicherzustellen, dass eine COM-Komponente zu einem bestimmten Zeitpunkt veröffentlicht wird, sollten Sie stattdessen die FinalReleaseComObject Methode verwenden. FinalReleaseComObject wird die zugrunde liegende COM-Komponente unabhängig davon freigeben, wie oft sie erneut in die CLR eingegeben wurde. Die interne Referenzanzahl der 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. Dadurch wird das gleiche Ergebnis wie die FinalReleaseComObject Methode erreicht.

Gilt für

Siehe auch