Marshal.ReleaseComObject(Object) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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.
o
ist null
.
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, 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 eine RCW umschlossen.
Der RCW verfügt über eine Verweisanzahl, die jedes Mal erhöht wird, wenn ein COM-Schnittstellenzeiger zugeordnet wird. Die ReleaseComObject -Methode verringert die Verweisanzahl eines RCW. Wenn die Verweisanzahl null erreicht, gibt die Runtime alle Verweise auf das nicht verwaltete COM-Objekt frei und löst eine aus System.NullReferenceException , wenn Sie versuchen, das Objekt weiter zu verwenden. Wenn dieselbe COM-Schnittstelle mehr als einmal von nicht verwaltetem Code an verwalteten Code übergeben wird, wird die Verweisanzahl im 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-Verweisanzahl-Freigabe erzwingen, sodass sie genau dann auftritt, wenn dies gewünscht ist. Eine unsachgemäße Verwendung von ReleaseComObject kann jedoch dazu führen, dass Ihre Anwendung fehlschlägt oder zu einer Zugriffsverletzung führen kann.
Stellen Sie sich ein Szenario vor, in dem verwalteter Code in einer Anwendungsdomäne an einem RCW gehalten wird, der eine COM-Komponente darstellt. Wenn Sie die ReleaseComObject -Methode für den RCW aufrufen, kann der verwaltete Code nicht auf die RCW zugreifen und löst eine Ausnahme aus InvalidComObjectException .
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 vornimmt, zu einer Zugriffsverletzung führt. Der Prozessspeicher kann jedoch beschädigt werden, und der Prozess kann so lange ausgeführt werden, bis er aus Gründen fehlschlägt, die sehr schwierig zu debuggen sind.
Dieses Risiko wird verstärkt, wenn die verwendete COM-Komponente ein Singleton ist, aus dem folgenden Grund: Die CLR aktiviert COM-Komponenten durch Aufrufen der COM-CoCreateInstance-Funktion , die bei jedem Aufruf für Singleton-COM-Komponenten den gleichen Schnittstellenzeiger zurückgibt. Daher können separate und unabhängige Teile des verwalteten Codes in einer Anwendungsdomäne dieselbe RCW für eine Singleton-COM-Komponente verwenden, und wenn einer die ReleaseComObject -Methode für die 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 bei jedem erneuten Eintritt der COM-Komponente in die CLR um eins erhöht. Daher können Sie die ReleaseComObject -Methode in einer Schleife aufrufen, bis der zurückgegebene Wert null ist. Dadurch wird das gleiche Ergebnis wie die FinalReleaseComObject -Methode erzielt.