Dela via


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 av T, ä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 av T förhindrar lossning.

  • En statisk referens till T av en annan dynamiskt definierad typ T1 som fortfarande kan nås genom att köra kod. Kan till exempel T1 härledas från T, eller T vara typen av en parameter i en metod för T1.

  • A ByRef till ett statiskt fält som tillhör T.

  • En RuntimeTypeHandle, RuntimeFieldHandle, eller RuntimeMethodHandle som refererar till T eller till en komponent i T.

  • 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 T kan till exempel Type hämtas från en matristyp vars elementtyp är T, eller från en allmän typ som har T som typargument.

  • En metod M i anropsstacken för valfri tråd, där M är en metod för T 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.

Se även