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škerá spravovaná a nespravovaná paměť používaná shromážděním a typy, které obsahuje, lze uvolnit. Informace, jako je název sestavení, se odeberou 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í collectible vytvořena a používána stejným způsobem jako ostatní dynamická sestavení.
Životnost shromáždění sestavení
Životnost shromáždění sestavení je řízena existenci odkazů na typy, které obsahuje, a objekty vytvořené 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 tato kolekce prázdná.Instance Type nebo TypeBuilder představující
T
.Důležité
Je nutné uvolnit všechny objekty, které představují části sestavení. Ten ModuleBuilder definuje
T
odkaz na objekt TypeBuildera AssemblyBuilder objekt uchovává odkaz na objekt ModuleBuilder, takže odkazy na tyto objekty musí být uvolněny. Dokonce i existence LocalBuilder nebo ILGenerator použití při konstrukciT
brání uvolnění.Statický odkaz na
T
jiný dynamicky definovaný typT1
, který je stále dostupný spuštěním kódu. Může být napříkladT1
odvozen odT
, neboT
může být typ parametru v metoděT1
.A
ByRef
do statického pole, které patří .T
A RuntimeTypeHandle, RuntimeFieldHandlenebo 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 proT
lze získat z typu pole, jehož typ prvku jeT
, nebo z obecného typu, který máT
jako argument typu.Metoda
M
zásobníku volání libovolného vlákna, kdeM
je metodaT
metody nebo metody na úrovni modulu, která je definována v sestavení.Delegát na statickou metodu definovanou v modulu sestavení.
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 je vytvořený obecný typ( v List<int>
jazyce C#) nebo List(Of Integer)
(v jazyce Visual Basic), který je vytvořen a používán při generování sestavení collectible, je považován za definovaný buď v sestavení, které obsahuje definici obecného typu nebo v sestavení, které obsahuje definici jednoho z argumentů typu. Přesné sestavení, které se používá, je podrobnosti implementace a může se změnit.
Omezení shromažďování sestavení
Následující omezení platí pro shromažďování sestavení:
Statické odkazy
Typy v běžném dynamickém sestavení nemohou mít statické odkazy na typy, které jsou definovány v shromáždění. 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žďování sestavení v rozhraní .NET Framework:
Interoperabilita modelu COM
V rámci shromáždění nelze definovat žádná rozhraní MODELU COM a žádné instance typů v rámci sestavení collectible 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í však mohou používat objekty, které implementují rozhraní MODELU COM.
Vyvolání platformy
Metody, které mají atribut, nebudou DllImportAttribute kompilovány, když jsou deklarovány v collectible sestavení. OpCodes.Calli Instrukce nelze použít při implementaci typu v sestavení s možností shromažďování a takové typy nelze zařaďovat 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í.
Zařazová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í
Reflexe generování je jediný mechanismus, který je podporovaný pro načítání shromáždění 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.
Statická data vláken
Statické proměnné vláken nejsou podporovány.
Následující omezení platí pro shromažďování sestavení v rozhraní .NET Framework a verzích .NET starších než .NET 9:
Statická pole s využitím
FixedAddressValueTypeAttribute
Statická pole definovaná v sestaveních, která jsou definována v collectible sestavení, nemohou mít FixedAddressValueTypeAttribute použitý atribut.