Delen via


Verzamelbare assemblages voor het genereren van dynamische typen

Verzamelbare assembly's zijn dynamische assembly's die kunnen worden ontladen zonder dat het toepassingsdomein waarin ze zijn gemaakt hoeft te worden verwijderd. Alle beheerde en onbeheerde geheugen die wordt gebruikt door een verzamelbare assembly en de typen die het bevat, kunnen worden vrijgemaakt. Informatie zoals de assemblynaam wordt verwijderd uit interne tabellen.

Om het lossen te activeren, gebruikt u de AssemblyBuilderAccess.RunAndCollect flag wanneer u een dynamische assembly maakt. De assembly is tijdelijk (dat wil zeggen, het kan niet worden opgeslagen) en is onderhevig aan beperkingen zoals beschreven in de sectie Beperkingen voor verzamelbare assembly's. Met de Common Language Runtime (CLR) wordt automatisch een verzamelbare assembly verwijderd wanneer u alle objecten die aan de assembly zijn gekoppeld, loslaat. In alle andere opzichten worden verzamelbare assembly's gemaakt en gebruikt op dezelfde manier als andere dynamische assembly's.

Levensduur van verzamelobjecten

De levensduur van een verzamelbare assembly wordt bepaald door het bestaan van verwijzingen naar de typen die deze bevat en de objecten die uit deze typen voortkomen. De algemene taalruntime ontlaadt geen assembly zolang er een of meer van de volgende bestaan (T is een type dat is gedefinieerd in de assembly):

  • Een exemplaar van T.

  • Een exemplaar van een matrix van T.

  • Een exemplaar van een algemeen type dat als een van de typeargumenten heeft T . Dit omvat algemene verzamelingen van T, zelfs als die verzameling leeg is.

  • Een exemplaar van Type of TypeBuilder dat vertegenwoordigt T.

    Belangrijk

    U moet alle objecten vrijgeven die onderdelen van de samenstelling vertegenwoordigen. De ModuleBuilder die T definieert, houdt een verwijzing naar de TypeBuilder bij, en het AssemblyBuilder-object houdt een verwijzing naar de ModuleBuilder bij, zodat verwijzingen naar deze objecten moeten worden vrijgegeven. Zelfs het bestaan van een LocalBuilder of een ILGenerator, gebruikt in de bouw van T, verhindert het lossen.

  • Een statische verwijzing naar T door een ander dynamisch gedefinieerd type T1 dat nog steeds bereikbaar is door het uitvoeren van code. Bijvoorbeeld, T1 kan zijn afgeleid van T, of T kan het type van een parameter zijn in een methode van T1.

  • Een ByRef naar een statisch veld dat tot T behoort.

  • Een RuntimeTypeHandle, RuntimeFieldHandleof RuntimeMethodHandle die verwijst naar T of naar een onderdeel van T.

  • Een exemplaar van een weerspiegelingsobject dat indirect of rechtstreeks kan worden gebruikt voor toegang tot het Type object dat vertegenwoordigt T. Het Type object voor T kan bijvoorbeeld worden verkregen uit een arraytype waarvan het elementtype T is, of uit een generiek type dat T als typeargument heeft.

  • Een methode M op de aanroepstack van een thread, waarbij M een methode T of een methode op moduleniveau is die in de assembly is gedefinieerd.

  • Een gemachtigde voor een statische methode die is gedefinieerd in een module van de assembly.

Als er slechts één item uit deze lijst bestaat voor slechts één type of één methode in de assembly, kan de runtime de assembly niet verwijderen.

Opmerking

De assembly wordt door de runtime pas daadwerkelijk ontladen nadat de finalizers zijn uitgevoerd voor alle items in de lijst.

Voor het bijhouden van de levensduur wordt een geconstrueerd algemeen type, zoals List<int> (in C#) of List(Of Integer) (in Visual Basic) dat is gemaakt en gebruikt bij het genereren van een verzamelbare assembly, beschouwd als gedefinieerd in de assembly die de algemene typedefinitie bevat of in een assembly die de definitie van een van de typeargumenten bevat. De exacte assembly die wordt gebruikt, is een implementatiedetail en kan worden gewijzigd.

Beperkingen voor verzamelbare assemblages

De volgende beperkingen gelden voor verzamelbare assemblies:

  • Statische verwijzingen

    Typen in een normale dynamische assembly mogen geen statische verwijzingen bevatten naar typen die zijn gedefinieerd in een verzamelbare assembly. Als u bijvoorbeeld een gewoon type definieert dat wordt overgenomen van een type in een verzamelbare assembly, wordt er een NotSupportedException uitzondering gegenereerd. Een type in een verzamelbare assembly kan statische verwijzingen hebben naar een type in een andere verzamelbare assembly, maar dit verlengt de levensduur van de assembly waarnaar wordt verwezen tot de levensduur van de verwijzende assembly.

De volgende beperkingen gelden voor verzamelbare assembly's in .NET Framework:

  • COM-interoperabiliteit

    Er kunnen geen COM-interfaces worden gedefinieerd binnen een verzamelbare assembly en er kunnen geen exemplaren van typen binnen een verzamelbare assembly worden geconverteerd naar COM-objecten. Een type in een verzamelbare assemblage kan niet fungeren als een COM-omhulsel (CCW) of runtime-omhulsel (RCW). Typen in verzamelbare assembly's kunnen echter objecten gebruiken die COM-interfaces implementeren.

  • Platform Invoke

    Methoden met het DllImportAttribute kenmerk worden niet gecompileerd wanneer ze worden gedeclareerd in een verzamelbare assembly. De OpCodes.Calli instructie kan niet worden gebruikt bij de implementatie van een type in een verzamelbare assembly en dergelijke typen kunnen niet worden ge marshalleerd naar onbeheerde code. U kunt echter systeemeigen code aanroepen met behulp van een ingangspunt dat wordt gedeclareerd in een niet-verzamelbare assembly.

  • Marshaling

    Objecten (met name gemachtigden) die zijn gedefinieerd in verzamelbare assembly's, kunnen niet worden ge marshalld. Dit is een beperking voor alle transiënte uitgezonden typen.

  • Assembly laden

    "Reflection emit is het enige mechanisme dat wordt ondersteund voor het laden van collecteerbare assemblies." Assembly's die worden geladen met een andere vorm van assembly laden, kunnen niet worden ontladen.

  • Contextgebonden objecten

    Contextstatische variabelen worden niet ondersteund. Typen in een verzamelbare assembly kunnen niet worden uitgebreid met ContextBoundObject. Code in verzamelbare assembly's kan echter contextgebonden objecten gebruiken die ergens anders zijn gedefinieerd.

  • Thread-statische gegevens

    Thread-statische variabelen worden niet ondersteund.

De volgende beperkingen gelden voor verzamelbare assembly's in .NET Framework- en .NET-versies vóór .NET 9:

  • Statische velden met FixedAddressValueTypeAttribute

    Statische velden die zijn gedefinieerd in verzamelbare assembly's, kunnen het FixedAddressValueTypeAttribute kenmerk niet toepassen.

Zie ook