Marshal.ReleaseComObject(Object) Metoda

Definicja

Dekrementuje liczbę odwołań do środowiska uruchomieniowego callable wrapper (RCW) skojarzonego z określonym obiektem 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

Obiekt COM do wydania.

Zwraca

Nowa wartość liczby odwołań RCW skojarzonej z o. Ta wartość jest zwykle równa zero, ponieważ RCW przechowuje tylko jedno odwołanie do opakowanego obiektu COM niezależnie od liczby zarządzanych klientów wywołujących je.

Atrybuty

Wyjątki

o jest nieprawidłowym obiektem COM.

Uwagi

Ta metoda służy do jawnego kontrolowania okresu istnienia obiektu COM używanego z kodu zarządzanego. Tej metody należy użyć do zwolnienia bazowego obiektu COM, który przechowuje odwołania do zasobów w odpowiednim czasie lub gdy obiekty muszą być zwolnione w określonej kolejności.

Za każdym razem, gdy wskaźnik interfejsu COM wchodzi do środowiska uruchomieniowego języka wspólnego (CLR), jest on owinięty w RCW.

RcW ma liczbę odwołań, która jest zwiększana za każdym razem, gdy wskaźnik interfejsu COM jest do niego mapowany. Metoda ReleaseComObject dekrementuje liczbę odwołań RCW. Gdy liczba odwołań osiągnie zero, środowisko uruchomieniowe zwalnia wszystkie odwołania do niezarządzanego obiektu COM i zgłasza wyjątek System.NullReferenceException w przypadku dalszej próby użycia obiektu. Jeśli ten sam interfejs COM jest przekazywany więcej niż jeden raz z niezarządzanego do kodu zarządzanego, liczba odwołań w otoce jest zwiększana za każdym razem, a wywołanie ReleaseComObject zwraca liczbę pozostałych odwołań.

Ta metoda umożliwia wymuszenie wydania liczby odwołań RCW w taki sposób, aby wystąpił dokładnie wtedy, gdy ma być. Jednak nieprawidłowe użycie elementu ReleaseComObject może spowodować niepowodzenie aplikacji lub spowodować naruszenie dostępu.

Rozważmy scenariusz, w którym kod zarządzany w domenie aplikacji jest trzymany w wersji RCW, która reprezentuje składnik COM. Jeśli wywołasz metodę ReleaseComObject w wersji RCW, kod zarządzany nie będzie mógł uzyskać dostępu do rcw i zgłosi wyjątek InvalidComObjectException .

Bardziej poważny błąd może wystąpić, jeśli wywołanie rcW jest wykonywane po zwolnieniu RCW. W takim przypadku istnieje prawdopodobieństwo, że wątek wykonujący wywołanie spowoduje naruszenie dostępu. Jednak pamięć procesu może ulec uszkodzeniu, a proces może nadal działać, dopóki nie ulegnie awarii z powodów, które są bardzo trudne do debugowania.

To ryzyko jest komplikowane, gdy składnik COM, który jest używany jest pojedynczy, z następującej przyczyny: CLR aktywuje składniki COM przez wywołanie funkcji COM CoCreateInstance , która zwraca ten sam wskaźnik interfejsu za każdym razem, gdy jest wywoływany dla pojedynczych składników COM. W związku z tym oddzielne i niezależne fragmenty kodu zarządzanego w domenie aplikacji mogą używać tej samej wersji RCW dla pojedynczego składnika COM, a jeśli którykolwiek z nich wywołuje ReleaseComObject metodę w składniku COM, drugi zostanie przerwany.

W związku z tym należy użyć ReleaseComObject tylko wtedy, gdy jest to absolutnie wymagane. Jeśli chcesz wywołać tę metodę, aby upewnić się, że składnik COM został zwolniony w określonym czasie, rozważ użycie FinalReleaseComObject metody . FinalReleaseComObject spowoduje zwolnienie podstawowego składnika COM niezależnie od tego, ile razy ponownie wprowadzono clR. Wewnętrzna liczba odwołań RCW jest zwiększana o jeden za każdym razem, gdy składnik COM ponownie wprowadza clR. W związku z tym można wywołać metodę ReleaseComObject w pętli, dopóki zwrócona wartość nie będzie równa zero. Daje to taki sam wynik jak FinalReleaseComObject metoda.

Dotyczy

Zobacz też