Marshal.ReleaseComObject(Object) Metódus
Definíció
Fontos
Egyes információk olyan, kiadás előtti termékekre vonatkoznak, amelyek a kiadásig még jelentősen módosulhatnak. A Microsoft nem vállal kifejezett vagy törvényi garanciát az itt megjelenő információért.
A megadott COM-objektumhoz társított futtatókörnyezeti hívható burkoló (RCW) hivatkozásainak száma csökken.
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
Paraméterek
- o
- Object
A kiadni kívánt COM-objektum.
Válaszok
A hozzá társított oRCW referenciaszámának új értéke. Ez az érték általában nulla, mivel az RCW csak egy hivatkozást tartalmaz a burkolt COM-objektumra, függetlenül attól, hogy hány felügyelt ügyfél hívja meg.
- Attribútumok
Kivételek
o nem érvényes COM-objektum.
o az null.
Megjegyzések
Ez a módszer a felügyelt kódból használt COM-objektumok élettartamának explicit szabályozására szolgál. Ezzel a módszerrel szabadíthatja fel az erőforrásokra mutató hivatkozásokat tartalmazó mögöttes COM-objektumot időben, vagy ha az objektumokat meghatározott sorrendben kell felszabadítani.
Minden alkalommal, amikor egy COM-felület mutatója belép a közös nyelvi futtatókörnyezetbe (CLR), az RCW-be van csomagolva.
Az RCW-nek van egy hivatkozásszáma, amely minden alkalommal növekszik, amikor a COM-felület mutatója rá van képezve. A ReleaseComObject metódus egy RCW referenciaszámát mérsékeli. Amikor a referenciaszám eléri a nullát, a futtatókörnyezet felszabadítja az összes hivatkozást a nem felügyelt COM-objektumon, és ad egy System.NullReferenceException hibát, ha az objektumot tovább szeretné használni. Ha ugyanazt a COM-felületet többször továbbítja a rendszer a nem felügyelt kódból a felügyelt kódba, a burkoló hivatkozásainak száma minden alkalommal növekszik, a hívás ReleaseComObject pedig a fennmaradó hivatkozások számát adja vissza.
Ezzel a módszerrel kényszerítheti az RCW-referenciaszám kiadását, hogy pontosan akkor történjen, amikor szeretné. A helytelen használat ReleaseComObject azonban az alkalmazás meghiúsulását vagy hozzáférés-megsértést okozhat.
Fontolja meg azt a forgatókönyvet, amelyben egy alkalmazástartomány felügyelt kódja egy COM-összetevőt képviselő RCW-hez van rögzítve. Ha meghívja a metódust ReleaseComObject az RCW-n, a felügyelt kód nem fog hozzáférni az RCW-hez, és kivételt InvalidComObjectException fog eredményezni.
Súlyosabb hiba léphet fel, ha az RCW hívása az RCW kiadásakor fut. Ebben az esetben jó esély van arra, hogy a hívást kezdeményező szál hozzáférés-megsértést okoz. Előfordulhat azonban, hogy a folyamatmemória megsérül, és a folyamat addig fut, amíg a hibakeresés nagyon nehéz okokból nem sikerül.
Ezt a kockázatot akkor növeli a rendszer, ha a használt COM-összetevő egyetlen egység, a következő okból: A CLR a COM-összetevőket a COM CoCreateInstance függvény meghívásával aktiválja, amely ugyanazt a felületmutatót adja vissza minden alkalommal, amikor egyszeri COM-összetevőkre kérik. Így az alkalmazástartományban lévő különálló és független felügyelt kódrészletek ugyanazt az RCW-t használhatják egy singleton COM-összetevőhöz, és ha valamelyik meghívja a ReleaseComObject metódust a COM-összetevőn, a másik hibás lesz.
Ezért csak akkor használja, ReleaseComObject ha feltétlenül szükséges. Ha ezt a metódust úgy szeretné meghívni, hogy egy COM-összetevő meghatározott időpontban legyen felszabadítva, fontolja meg inkább a FinalReleaseComObject metódus használatát. FinalReleaseComObject a rendszer a mögöttes COM-összetevőt attól függetlenül felszabadítja, hogy hányszor lépett be újra a CLR-be. Az RCW belső hivatkozási száma minden alkalommal megnövekedik, amikor a COM-összetevő újra belép a CLR-be. Ezért meghívhatja a ReleaseComObject metódust egy hurokban, amíg a visszaadott érték nulla. Ez ugyanazt az eredményt éri el, mint a FinalReleaseComObject módszer.