Marshal.ReleaseComObject(Object) Methode

Definitie

Hiermee wordt het referentieaantal van de Runtime Callable Wrapper (RCW) die is gekoppeld aan het opgegeven COM-object, afgetrokken.

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

Parameters

o
Object

Het COM-object dat moet worden vrijgegeven.

Retouren

De nieuwe waarde van het referentieaantal van de RCW die is gekoppeld aan o. Deze waarde is doorgaans nul omdat de RCW slechts één verwijzing naar het verpakte COM-object bewaart, ongeacht het aantal beheerde clients dat het aanroept.

Kenmerken

Uitzonderingen

o is geen geldig COM-object.

Opmerkingen

Deze methode wordt gebruikt om expliciet de levensduur van een COM-object te bepalen dat wordt gebruikt vanuit beheerde code. U moet deze methode gebruiken om het onderliggende COM-object dat verwijzingen naar resources tijdig bevat, vrij te maken of wanneer objecten in een specifieke volgorde moeten worden vrijgemaakt.

Telkens wanneer een COM Interface-aanwijzer de COMMON Language Runtime (CLR) invoert, wordt deze verpakt in een RCW.

De RCW heeft een verwijzingsaantal dat steeds wordt verhoogd wanneer een COM-interfacepointer eraan wordt toegewezen. Met de ReleaseComObject methode wordt het referentieaantal van een RCW afgetrokken. Wanneer het aantal verwijzingen nul bereikt, worden alle verwijzingen vrijgegeven op het niet-beheerde COM-object en wordt er een System.NullReferenceException gegenereerd als u het object verder probeert te gebruiken. Als dezelfde COM-interface meer dan één keer wordt doorgegeven van niet-beheerde code, wordt het aantal verwijzingen op de wrapper steeds verhoogd en wordt het aantal resterende verwijzingen door aanroepen ReleaseComObject geretourneerd.

Met deze methode kunt u een RCW-referentieaantalrelease afdwingen, zodat deze precies optreedt wanneer u dat wilt. Een onjuist gebruik van ReleaseComObject uw toepassing kan echter mislukken of kan een schending van de toegang veroorzaken.

Overweeg een scenario waarin beheerde code in een toepassingsdomein wordt vastgehouden aan een RCW die een COM-onderdeel vertegenwoordigt. Als u de ReleaseComObject methode op de RCW aanroept, heeft de beheerde code geen toegang tot de RCW en wordt er een InvalidComObjectException uitzondering gegenereerd.

Er kan een ernstigere fout optreden als een aanroep naar de RCW wordt uitgevoerd wanneer de RCW wordt vrijgegeven. In dit geval is er een goede kans dat de thread die de aanroep maakt, een toegangsschending veroorzaakt. Het procesgeheugen kan echter beschadigd raken en het proces kan blijven worden uitgevoerd totdat het mislukt om redenen die erg moeilijk zijn om fouten op te sporen.

Dit risico wordt samengesteld wanneer het COM-onderdeel dat wordt gebruikt een singleton is, om de volgende reden: De CLR activeert COM-onderdelen door de functie COM CoCreateInstance aan te roepen, die dezelfde interfacepointer retourneert telkens wanneer deze wordt aangeroepen voor singleton COM-onderdelen. Daarom kunnen afzonderlijke en onafhankelijke onderdelen van beheerde code in een toepassingsdomein dezelfde RCW gebruiken voor een singleton COM-onderdeel en als een van beide de ReleaseComObject methode aanroept op het COM-onderdeel, wordt de andere verbroken.

Gebruik daarom de ReleaseComObject enige als deze absoluut vereist is. Als u deze methode wilt aanroepen om ervoor te zorgen dat een COM-onderdeel op een bepaald tijdstip wordt vrijgegeven, kunt u overwegen de FinalReleaseComObject methode te gebruiken. FinalReleaseComObject zal het onderliggende COM-onderdeel vrijgeven, ongeacht hoe vaak het opnieuw de CLR heeft ingevoerd. Het interne referentieaantal van de RCW wordt steeds verhoogd wanneer het COM-onderdeel de CLR opnieuw invoert. Daarom kunt u de ReleaseComObject methode in een lus aanroepen totdat de geretourneerde waarde nul is. Dit levert hetzelfde resultaat op als de FinalReleaseComObject methode.

Van toepassing op

Zie ook