Samlingsbara sammansättningar för dynamisk typgenerering
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 som sammansättningsnamnet tas bort från interna tabeller.
Om du vill aktivera avlastning använder AssemblyBuilderAccess.RunAndCollect du flaggan när du skapar en dynamisk sammansättning. 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 språkkörningen tar inte bort en sammansättning så länge en eller flera av följande finns (T
är någon typ som definieras i sammansättningen):
En instans av
T
.En instans av en matris med
T
.En instans av en allmän typ som har
T
som 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. Som ModuleBuilder definierar
T
behå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 avT
förhindrar lossning.En statisk referens till
T
av en annan dynamiskt definierad typT1
som fortfarande kan nås genom att köra kod. Kan till exempelT1
härledas frånT
, ellerT
vara typen av en parameter i en metod förT1
.A
ByRef
till ett statiskt fält som tillhörT
.En RuntimeTypeHandle, RuntimeFieldHandle, eller RuntimeMethodHandle som refererar till
T
eller 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örT
kan till exempel Type hämtas från en matristyp vars elementtyp ärT
, eller från en allmän typ som harT
som typargument.En metod
M
i anropsstacken för valfri tråd, därM
är en metod förT
eller 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 bara finns ett objekt från den här listan för endast en typ eller en metod i sammansättningen kan körningen inte ta bort sammansättningen.
Kommentar
Körningen tar inte bort sammansättningen förrän slutförarna 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 en samlingsbar sammansättning kan inte fungera som en COM-anropsbar omslutning (CCW) eller runtime callable wrapper (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.
Marskalkning
Objekt (i synnerhet ombud) som definieras i samlingsbara sammansättningar kan inte ordnas. Detta är en begränsning för alla tillfälliga avgivna 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 monteringsinläsning kan inte tas bort.
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
FixedAddressValueTypeAttribute
Statiska fält som definieras i samlarbara sammansättningar kan inte ha attributet FixedAddressValueTypeAttribute tillämpat.