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á k o. 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ří jej 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ž objekty musí být uvolněny 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 navyšuje pokaždé, když je na něj namapován ukazatel rozhraní MODELU 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á výjimku, pokud se pokusíte objekt použít dále. Pokud je stejné rozhraní MODELU COM předáno vícekrát z nespravovaného spravovaného kódu, počet odkazů na obálku se pokaždé navyší 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 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á výjimku InvalidComObjectException .

K vážnější chybě může dojít v případě, že se při uvolnění rcw spustí volání rcw. V tomto případě je 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 běžet až do selhání z důvodů, které je velmi obtížné ladit.

Toto riziko je složeno, když je použit komponenta COM, je 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 jednoúčelové komponenty COM. Proto samostatné a nezávislé části spravovaného kódu v doméně aplikace mohou používat stejnou RCW pro jednoúčelovou komponentu COM, a pokud jeden z nich volá metodu ReleaseComObject na komponentě COM, druhý bude poškozen.

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 MODULU CLR navyšuje o jeden. Proto můžete metodu ReleaseComObject volat ve smyčce, dokud vrácená hodnota nebude nulová. Tím dosáhnete stejného výsledku jako metoda FinalReleaseComObject .

Platí pro

Viz také