Kolekční sestavení pro generování dynamických typů

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á T jako jeden z argumentů typu. To zahrnuje obecné kolekce T, 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 konstrukci T, brání vyložení.

  • Statický odkaz na T jiný dynamicky definovaný typ T1 , který je stále dostupný spuštěním kódu. Může být například T1 odvozen od T, nebo T může být typ parametru v metodě T1.

  • Odkaz ByRef na statické pole, které patří k T.

  • A RuntimeTypeHandle, RuntimeFieldHandle, nebo RuntimeMethodHandle které odkazuje na T nebo na součást T.

  • 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 pro T lze získat z typu pole, jehož typ prvku je T, nebo z obecného typu, který má T jako argument typu.

  • Metoda M v zásobníku volání libovolného vlákna, kde M je metoda T nebo 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 FixedAddressValueTypeAttribute

    Statická pole definovaná v collectible sestaveních nemohou mít použitý atribut FixedAddressValueTypeAttribute.

Viz také