Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Collectible sestavení jsou dynamická sestavení, která lze uvolnit bez uvolnění domény aplikace, ve které byly vytvořeny. Veškerou spravovanou i nespravovanou paměť, kterou využívá sběratelské shromáždění a typy, jež obsahuje, lze uvolnit. Informace, jako je název sestavení, se odstraní z interních tabulek.
Chcete-li povolit uvolnění, použijte AssemblyBuilderAccess.RunAndCollect příznak při vytváření dynamického sestavení. Sestavení je přechodné (tj. nelze jej uložit) a podléhá omezením popsaným v části Omezení shromažďování sestavení . Modul CLR (Common Language Runtime) automaticky uvolní shromažďovatelné sestavení, když uvolníte všechny objekty přidružené k sestavení. Ve všech ostatních ohledech jsou sestavení typu collectible vytvořena a používána stejným způsobem jako ostatní dynamická sestavení.
Životnost sběratelských sestavení
Životnost sběratelské sestavy je řízena existencí odkazů na typy, které obsahuje, a objektů vytvořených z těchto typů. Modul CLR (Common Language Runtime) nevyvolá sestavení za předpokladu, že existuje jeden nebo více následujících typů (T je jakýkoli typ definovaný v sestavení):
Instance
T.Instance pole
T.Instance obecného typu, který má
Tjako jeden z argumentů typu. To zahrnuje obecné kolekceT, i když je kolekce prázdná.Instance Type nebo TypeBuilder, která představuje
T.Důležité
Je nutné uvolnit všechny objekty, které představují části sestavení. Ten ModuleBuilder, který definuje
T, zachovává odkaz na TypeBuilder, a objekt AssemblyBuilder uchovává odkaz na ModuleBuilder, takže odkazy na tyto objekty musí být uvolněny. Dokonce i existence LocalBuilder nebo ILGenerator, které jsou použity při konstrukciT, brání vyložení.Statický odkaz na
Tjiný dynamicky definovaný typT1, který je stále dostupný spuštěním kódu. Může být napříkladT1odvozen odT, neboTmůže být typ parametru v metoděT1.Odkaz
ByRefna statické pole, které patří kT.A RuntimeTypeHandle, RuntimeFieldHandle, nebo RuntimeMethodHandle které odkazuje na
Tnebo na součástT.Instance jakéhokoli objektu reflexe, který by mohl být použit nepřímo nebo přímo pro přístup k objektu Type , který představuje
T. Například Type objekt proTlze získat z typu pole, jehož typ prvku jeT, nebo z obecného typu, který máTjako argument typu.Metoda
Mv zásobníku volání libovolného vlákna, kdeMje metodaTnebo metoda na úrovni modulu, která je definována v sestavení.Delegát pro statickou metodu definovanou v modulu v sestavě.
Pokud existuje pouze jedna položka z tohoto seznamu pouze pro jeden typ nebo jednu metodu v sestavení, modul runtime nemůže uvolnit sestavení.
Poznámka:
Modul runtime ve skutečnosti nevyvolá sestavení, dokud se finalizační metody nespustí pro všechny položky v seznamu.
Pro účely sledování životnosti se považuje vytvořený generický typ, jako je například List<int> v C# nebo List(Of Integer) v jazyce Visual Basic, který je vytvořen a používán při generování sestavení typu collectible, za definovaný buď v sestavení, které obsahuje definici generického typu, nebo v sestavení, které obsahuje definici jednoho z jeho argumentů typu. Přesné sestavení, které se používá, je detail implementace a může se změnit.
Omezení shromažďování sestav
Na sběratelské sestavy se vztahují následující omezení:
Statické odkazy
Typy v běžném dynamickém sestavení nemohou mít statické odkazy na typy, které jsou definovány ve sbíratelném sestavení. Pokud například definujete běžný typ, který dědí z typu v shromažďovatelném sestavení, NotSupportedException je vyvolána výjimka. Typ v shromážditelném sestavení může mít statické odkazy na typ v jiném sběritelném sestavení, ale tím se prodlužuje životnost odkazovaného sestavení na dobu životnosti odkazujícího sestavení.
Následující omezení platí pro shromažďovatelné sestavení v rozhraní .NET Framework:
Interoperabilita modelu COM
V rámci sbíratelného sestavení nelze definovat žádná rozhraní COM a žádné instance typů v rámci sbíratelného sestavení nelze převést na objekty COM. Typ v shromáždění nemůže sloužit jako obálka COM (CCW) nebo obálka volatelná za běhu (RCW). Typy v collectible sestaveních však mohou používat objekty, které implementují COM rozhraní.
Vyvolání platformy
Metody, které mají atribut DllImportAttribute, nebudou kompilovány, když jsou deklarovány v sestavení k dispozici ke sběru. Instrukci OpCodes.Calli nelze použít při implementaci typu v shromažďovatelném sestavení a takové typy nelze zařadit do nespravovaného kódu. K volání nativního kódu však můžete použít vstupní bod deklarovaný v neshromažďovatelném sestavení.
Sbírání a uspořádávání
Objekty (zejména delegáti), které jsou definovány v shromážditelných sestaveních, nelze zařaďovat. Toto omezení platí pro všechny přechodné typy vygenerované.
Načítání sestavení
Generování reflexe je jediný mechanismus, který je podporován pro načítání shromažďovatelných sestavení. Sestavení načtená pomocí jiné formy načítání sestavení nelze uvolnit.
Objekty vázané na kontext
Kontextové statické proměnné nejsou podporovány. Typy v sběritelném sestavení nelze rozšířit ContextBoundObject. Kód v shromážditelných sestaveních však může používat objekty vázané na kontext, které jsou definovány jinde.
Data specifická pro vlákno
Statické proměnné vláken nejsou podporovány.
Následující omezení platí pro přenositelné sestavy v rozhraní .NET Framework a verzích .NET předcházejících verzi 9:
Statická pole s využitím
FixedAddressValueTypeAttributeStatická pole definovaná v collectible sestaveních nemohou mít použitý atribut FixedAddressValueTypeAttribute.