Verzamelbare assembly's voor het genereren van dynamisch type
Verzamelbare assembly's zijn dynamische assembly's die kunnen worden verwijderd zonder het toepassingsdomein waarin ze zijn gemaakt, te lossen. 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.
Als u het lossen wilt inschakelen, gebruikt u de AssemblyBuilderAccess.RunAndCollect vlag wanneer u een dynamische assembly maakt. De assembly is tijdelijk (dat wil gezegd, het kan niet worden opgeslagen) en is onderhevig aan beperkingen die worden 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 verzamelbare assembly's
De levensduur van een verzamelbare assembly wordt bepaald door het bestaan van verwijzingen naar de typen die deze bevat en de objecten die op basis van deze typen worden gemaakt. 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 assembly vertegenwoordigen. De ModuleBuilder definitie houdt
T
een verwijzing naar de TypeBuilder, en het AssemblyBuilder object houdt een verwijzing naar de ModuleBuilder, zodat verwijzingen naar deze objecten moeten worden vrijgegeven. Zelfs het bestaan van een LocalBuilder of een ILGenerator gebruikt in de bouw vanT
voorkomt het lossen.Een statische verwijzing naar
T
een ander dynamisch gedefinieerd typeT1
dat nog steeds bereikbaar is door code uit te voeren. Kan bijvoorbeeldT1
zijn afgeleid vanT
, ofT
kan het type van een parameter in een methode vanT1
.A
ByRef
aan een statisch veld waartoeT
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 object kanT
bijvoorbeeld worden opgehaald uit een matrixtype waarvan het Type elementtype isT
, of van een algemeen type dat als typeargument heeftT
.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.
Notitie
De runtime wordt de assembly pas daadwerkelijk verwijderd 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 assembly's
De volgende beperkingen gelden voor verzamelbare assembly's:
Statische verwijzingen
Typen in een gewone dynamische assembly kunnen geen statische verwijzingen hebben 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 assembly kan niet fungeren als een COM callable wrapper (CCW) of runtime callable wrapper (RCW). Typen in verzamelbare assembly's kunnen echter objecten gebruiken die COM-interfaces implementeren.
Platform aanroepen
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 tijdelijke verzonden typen.
Assembly laden
Reflectie-emit is het enige mechanisme dat wordt ondersteund voor het laden van verzamelbare assembly's. 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 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.