Sdílet prostřednictvím


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 , Ti 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 konstrukci T brání uvolnění.

  • 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.

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

Viz také