Marshal.ReleaseComObject(Object) Metoda

Definice

Sníží počet odkazů obálky volatelného modulu runtime (RCW) přidruženého k zadanému objektu COM.

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

Parametry

o
Object

Objekt COM, který se má uvolnit.

Návraty

Nová hodnota referenčního počtu RCW přidružených k o. Tato hodnota je obvykle nula, protože rcW uchovává pouze jeden odkaz na zabalený objekt COM bez ohledu na počet spravovaných klientů, kteří ji volají.

Atributy

Výjimky

o není platný objekt COM.

Poznámky

Tato metoda slouží k explicitní kontrole životnosti objektu COM používaného ze spravovaného kódu. Tuto metodu byste měli použít k uvolnění základního objektu COM, který obsahuje odkazy na prostředky včas nebo kdy musí být objekty uvolněny v určitém pořadí.

Pokaždé, když ukazatel rozhraní MODELU COM přejde do modulu CLR (Common Language Runtime), zabalí se do RCW.

Analýza RCW má referenční počet, který se zvýší při každém namapování ukazatele rozhraní MODELU COM na něj. Metoda ReleaseComObject sníží počet odkazů rcW. Pokud počet odkazů dosáhne nuly, modul runtime uvolní všechny jeho odkazy na nespravovaný objekt COM a vyvolá System.NullReferenceException výjimku, pokud se pokusíte objekt použít dále. Pokud je stejné rozhraní MODELU COM předáno více než jednou z nespravovaných do spravovaného kódu, počet odkazů na obálku se zvýší pokaždé a volání ReleaseComObject vrátí počet zbývajících odkazů.

Tato metoda umožňuje vynutit vydání referenčního počtu RCW tak, aby k němu došlo přesně tehdy, když ho chcete. Nesprávné použití ReleaseComObject však může způsobit selhání aplikace nebo může způsobit narušení přístupu.

Představte si scénář, ve kterém se spravovaný kód v doméně aplikace drží ve verzi RCW, která představuje komponentu COM. Pokud zavoláte metodu rcW ReleaseComObject , spravovaný kód nebude mít přístup k rcW a vyvolá InvalidComObjectException výjimku.

Vážnější chyba může nastat, pokud se při vydání rcW spustí volání RCW. V tomto případě existuje dobrá šance, že vlákno, které volá, způsobí narušení přístupu. Paměť procesu však může být poškozena a proces může běžet, dokud se nezdaří z důvodů, které jsou velmi obtížné ladit.

Toto riziko se sloučí, když použitá komponenta COM je jednoúčelový, z následujícího důvodu: CLR aktivuje komponenty MODELU COM voláním funkce COM CoCreateInstance , která vrátí stejný ukazatel rozhraní pokaždé, když je volána pro jednoúčelové komponenty MODELU COM. Samostatné a nezávislé části spravovaného kódu v doméně aplikace proto můžou používat stejnou rcW pro jednu komponentu COM a pokud některý z nich volá metodu ReleaseComObject na komponentě COM, druhá bude poškozena.

Proto používejte ReleaseComObject pouze v případě, že je to naprosto povinné. Pokud chcete volat tuto metodu, aby se zajistilo, že komponenta COM je uvolněna v určený čas, zvažte místo toho použití FinalReleaseComObject metody. FinalReleaseComObject uvolní základní komponentu COM bez ohledu na to, kolikrát se znovu zadala clR. Počet interních odkazů RCW se zvýší o jeden při každém opětovném zadání komponenty MODELU COM do modulu CLR. Proto můžete metodu ReleaseComObject volat ve smyčce, dokud vrácená hodnota není nula. Tím dosáhnete stejného výsledku jako metoda FinalReleaseComObject .

Platí pro

Viz také