Sdílet prostřednictvím


Marshal.ReleaseComObject(Object) Metoda

Definice

Sníží počet odkazů modulu Runtime Callable Wrapper (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é ok . Tato hodnota je obvykle nulová, protože rcW uchovává pouze jeden odkaz na zabalený objekt COM bez ohledu na počet spravovaných klientů, kteří ho volají.

Atributy

Výjimky

o není platný objekt COM.

Poznámky

Tato metoda se používá k explicitní kontrole životnosti objektu COM použité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ž je třeba uvolnit objekty v určitém pořadí.

Pokaždé, když ukazatel rozhraní COM vstoupí do modulu CLR (Common Language Runtime), je zabalen do RCW.

RcW má počet odkazů, který se zvýší pokaždé, když je na něj namapován ukazatel rozhraní COM. Metoda ReleaseComObject sníží počet odkazů rcw. Když počet odkazů dosáhne nuly, modul runtime uvolní všechny své odkazy na nespravovaný System.NullReferenceException objekt COM a vyvolá při pokusu o další použití objektu. Pokud je stejné rozhraní MODELU COM předáno více než jednou z nespravovaného spravovaného kódu, počet odkazů na obálku se pokaždé zvýší 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ě v případě, že chcete. Nesprávné použití ReleaseComObject aplikace však může způsobit selhání aplikace nebo narušení přístupu.

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

K vážnější chybě může dojít, pokud se při vydání rcw spustí volání rcW. V tomto případě existuje velká pravděpodobnost, ž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 pokračovat v provozu, dokud selže z důvodů, které je velmi obtížné ladit.

Toto riziko se sčítá, když je komponenta modelu COM, která se používá, singleton, z následujícího důvodu: ClR aktivuje komponenty modelu COM voláním funkce COM CoCreateInstance , která vrací stejný ukazatel rozhraní pokaždé, když je volána pro komponenty modelu COM singleton. Proto samostatné a nezávislé části spravovaného kódu v doméně aplikace mohou používat stejný RCW pro jednoúčelovou komponentu COM, a pokud jeden z nich volá metodu ReleaseComObject na komponentě COM, druhá bude poškozena.

Proto použijte pouze v ReleaseComObject případě, že je to nezbytně nutné. Pokud chcete volat tuto metodu, aby se zajistilo, že součást modelu COM je uvolněna v určeném čase, zvažte použití FinalReleaseComObject metody místo toho. FinalReleaseComObject uvolní podkladovou komponentu modelu COM bez ohledu na to, kolikrát znovu vstoupila do modulu CLR. Počet interních odkazů RCW se při každém opětovném vstupu komponenty modelu COM do CLR zvýší o jeden. Proto můžete volat metodu ReleaseComObject ve smyčce, dokud vrácená hodnota nebude nula. Tím dosáhnete stejného výsledku jako metoda FinalReleaseComObject .

Platí pro

Viz také