Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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 vanT
, 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 vanT
, verhindert het lossen.Een statische verwijzing naar
T
door een ander dynamisch gedefinieerd typeT1
dat nog steeds bereikbaar is door het uitvoeren van code. Bijvoorbeeld,T1
kan zijn afgeleid vanT
, ofT
kan het type van een parameter zijn in een methode vanT1
.Een
ByRef
naar een statisch veld dat totT
behoort.Een RuntimeTypeHandle, RuntimeFieldHandleof RuntimeMethodHandle die verwijst naar
T
of naar een onderdeel vanT
.Een exemplaar van een weerspiegelingsobject dat indirect of rechtstreeks kan worden gebruikt voor toegang tot het Type object dat vertegenwoordigt
T
. Het Type object voorT
kan bijvoorbeeld worden verkregen uit een arraytype waarvan het elementtypeT
is, of uit een generiek type datT
als typeargument heeft.Een methode
M
op de aanroepstack van een thread, waarbijM
een methodeT
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.