Udostępnij za pośrednictwem


Marshal.ReleaseComObject(Object) Metoda

Definicja

Dekrementuje liczbę odwołań otoki wywoływanej środowiska uruchomieniowego (RCW) skojarzonej 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 elementem o. Ta wartość jest zwykle zerowa, ponieważ RCW przechowuje tylko jedno odwołanie do opakowanego obiektu COM niezależnie od liczby zarządzanych klientów wywołujących go.

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. Należy użyć tej metody, aby zwolnić bazowy obiekt COM, który przechowuje odwołania do zasobów w odpowiednim czasie lub gdy obiekty muszą zostać uwolnione w określonej kolejności.

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

RcW ma liczbę odwołań, która jest zwiększana za każdym razem, gdy wskaźnik interfejsu COM jest mapowany na niego. 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 System.NullReferenceException błąd, jeśli spróbujesz użyć obiektu dalej. 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 odbywało się dokładnie wtedy, gdy chcesz. Jednak niewłaściwe użycie 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 na RCW, który reprezentuje składnik COM. Jeśli wywołasz metodę w ReleaseComObject wersji RCW, kod zarządzany nie będzie mógł uzyskać dostępu do wersji RCW i zgłosi InvalidComObjectException wyjątek.

Bardziej poważny błąd może wystąpić, jeśli wywołanie rcW jest wykonywane po wydaniu 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 powiedzie się z powodów, które są bardzo trudne do debugowania.

To ryzyko jest złożone, gdy składnik COM, który jest używany jest pojedynczy, z następującego powodu: 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 składników MODELU COM pojedynczego. W związku z tym oddzielne i niezależne elementy kodu zarządzanego w domenie aplikacji mogą używać tej samej wersji RCW dla pojedynczego składnika COM, a jeśli któryś 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 jest zwalniany w określonym czasie, rozważ użycie FinalReleaseComObject metody . FinalReleaseComObject wyda podstawowy składnik 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. Pozwala to osiągnąć ten sam wynik co FinalReleaseComObject metoda.

Dotyczy

Zobacz też