Marshal.ReleaseComObject(Object) Metoda
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Dekrementuje liczbę odwołań ś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 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.
Parametr o ma wartość null.
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 przechodzi do środowiska uruchomieniowego języka wspólnego (CLR), jest owinięty 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ż 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 niewłaściwe 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 reprezentującej składnik COM. Jeśli wywołasz metodę ReleaseComObject w wersji RCW, kod zarządzany nie będzie mógł uzyskać dostępu do wersji RCW i zgłosi wyjątek InvalidComObjectException .
W przypadku uruchomienia wywołania rcw może wystąpić poważniejszy błąd. W takim przypadku istnieje duża szansa, ż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 złożone, gdy używany składnik COM jest pojedynczym elementem, 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 fragmenty kodu zarządzanego w domenie aplikacji mogą używać tej samej wersji RCW dla pojedynczego składnika COM, a jeśli jeden 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 program zwolni podstawowy składnik COM niezależnie od tego, ile razy ponownie wprowadził 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ć ReleaseComObject metodę w pętli, dopóki zwrócona wartość nie będzie równa zero. Daje to taki sam wynik jak FinalReleaseComObject metoda.