Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Samlingsbara sammansättningar är dynamiska sammansättningar som kan tas bort utan att den programdomän där de skapades tas bort. Allt hanterat och ohanterat minne som används av en samlingsbar sammansättning och de typer som den innehåller kan frigöras. Information, såsom sammansättningsnamnet, tas bort från interna tabeller.
Om du vill aktivera avlastning använder du flaggan AssemblyBuilderAccess.RunAndCollect när du skapar en dynamisk samling. Sammansättningen är tillfällig (det vill: den kan inte sparas) och omfattas av begränsningar som beskrivs i avsnittet Begränsningar för samlarbara sammansättningar . CLR (Common Language Runtime) tar bort en samlingsbar sammansättning automatiskt när du släpper alla objekt som är associerade med sammansättningen. I alla andra avseenden skapas och används samlarbara sammansättningar på samma sätt som andra dynamiska sammansättningar.
Livslängd för samlarbara sammansättningar
Livslängden för en samlingsbar sammansättning styrs av förekomsten av referenser till de typer som den innehåller och de objekt som skapas från dessa typer. Den vanliga körtiden avlastar inte en assembly så länge en eller flera av följande finns kvar (T är någon typ som definieras i assemblyn):
En instans av
T.En instans av en matris med
T.En instans av en allmän typ som har
Tsom ett av sina typargument. Detta inkluderar allmänna samlingar avT, även om samlingen är tom.En instans av Type eller TypeBuilder som representerar
T.Viktigt!
Du måste frigöra alla objekt som representerar delar av sammansättningen. ModuleBuilder som definierar
Tbehåller en referens till TypeBuilder, och AssemblyBuilder-objektet behåller en referens till ModuleBuilder, så referenser till dessa objekt måste släppas. Även förekomsten av en LocalBuilder eller en ILGenerator som används i konstruktionen avTförhindrar lossning.En statisk referens till
Tav en annan dynamiskt definierad typT1som fortfarande kan nås genom att köra kod. Kan till exempelT1härledas frånT, ellerTvara typen av en parameter i en metod förT1.Ett
ByReftill ett statiskt fält som tillhörT.En RuntimeTypeHandle, RuntimeFieldHandle, eller RuntimeMethodHandle som refererar till
Teller till en komponent iT.En instans av ett reflektionsobjekt som kan användas indirekt eller direkt för att komma åt objektet Type som representerar
T. Objektet för Type kan till exempelThämtas från en matristyp vars elementtyp ärT, eller från en allmän typ som harTsom typargument.En metod
Mi anropsstacken för valfri tråd, därMär en metod förTeller en metod på modulnivå som definieras i sammansättningen.Ett ombud till en statisk metod som definieras i en modul i sammansättningen.
Om det endast finns ett objekt från den här listan för en typ eller en metod i sammansättningen kan körtiden inte avlasta sammansättningen.
Anmärkning
Körtiden laddar inte ur assemblyn förrän finalizers har körts för alla objekt i listan.
För att spåra livslängd anses en konstruerad allmän typ som List<int> (i C#) eller List(Of Integer) (i Visual Basic) som skapas och används i genereringen av en samlingsbar sammansättning ha definierats antingen i sammansättningen som innehåller den generiska typdefinitionen eller i en sammansättning som innehåller definitionen av ett av dess typargument. Den exakta sammansättning som används är en implementeringsinformation och kan komma att ändras.
Begränsningar för insamlingsbara sammansättningar
Följande begränsningar gäller för samlarbara sammansättningar:
Statiska referenser
Typer i en vanlig dynamisk sammansättning kan inte ha statiska referenser till typer som definieras i en samlingsbar sammansättning. Om du till exempel definierar en vanlig typ som ärver från en typ i en samlingsbar sammansättning genereras ett NotSupportedException undantag. En typ i en samlingsbar sammansättning kan ha statiska referenser till en typ i en annan samlingsbar sammansättning, men detta förlänger livslängden för den refererade sammansättningen till referenssammansättningens livslängd.
Följande begränsningar gäller för samlarbara sammansättningar i .NET Framework:
COM-interop
Inga COM-gränssnitt kan definieras i en samlingsbar sammansättning och inga instanser av typer i en samlingsbar sammansättning kan konverteras till COM-objekt. En typ i ett samlarobjekt kan inte fungera som en COM-anropsbar omslutning (CCW) eller en runtime-anropsbar omslutning (RCW). Men typer i samlarbara sammansättningar kan använda objekt som implementerar COM-gränssnitt.
Plattformsanrop
Metoder som har DllImportAttribute attributet kompileras inte när de deklareras i en samlingsbar sammansättning. Instruktionen OpCodes.Calli kan inte användas i implementeringen av en typ i en samlingsbar sammansättning, och sådana typer kan inte kopplas till ohanterad kod. Du kan dock anropa intern kod med hjälp av en startpunkt som deklareras i en icke-samlarbar sammansättning.
Samordning
Objekt (i synnerhet delegater) som definieras i samlingsbara sammansättningar kan inte överföras. Detta är en begränsning för alla tillfälliga utsläppta typer.
Monteringsinläsning
Reflektionsemitta är den enda mekanism som stöds för inläsning av samlarbara sammansättningar. Sammansättningar som läses in med någon annan form av inläsning av sammansättningar kan inte avläsas.
Kontextbundna objekt
Kontext-statiska variabler stöds inte. Typer i en samlingsbar sammansättning kan inte utöka ContextBoundObject. Kod i samlarbara sammansättningar kan dock använda kontextbundna objekt som definieras någon annanstans.
Trådstatiska data
Trådstatiska variabler stöds inte.
Följande begränsningar gäller för samlarbara sammansättningar i .NET Framework- och .NET-versioner före .NET 9:
Statiska fält med
FixedAddressValueTypeAttributeStatiska fält som definieras i samlarbara sammansättningar kan inte ha attributet FixedAddressValueTypeAttribute tillämpat.