Partager via


Assemblys pouvant être collectés pour la génération de types dynamic

Les assemblys pouvant être collectés sont des assemblys dynamiques qui peuvent être déchargés sans décharger le domaine d'application dans lequel ils ont été créés. La totalité de la mémoire managée et non managée utilisée par un assembly pouvant être collecté et les types qu'il contient peut être libérée. Les informations telles que le nom de l'assembly sont supprimées des tables internes.

Pour activer le déchargement, utilisez l'indicateur AssemblyBuilderAccess.RunAndCollect lorsque vous créez un assembly dynamique. L'assembly est transitoire (autrement dit, il ne peut pas être enregistré) et est soumis aux limitations décrites dans la section Restrictions sur les assemblys pouvant être collectés. Le Common Language Runtime (CLR) décharge automatiquement un assembly pouvant être collecté une fois que vous avez libéré tous les objets associés à l'assembly. Pour le reste, les assemblys pouvant être collectés sont créés et utilisés de la même manière que les autres assemblys dynamiques.

Durée de vie des assemblys pouvant être collectés

La durée de vie d'un assembly dynamique pouvant être collecté est contrôlée par l'existence de références aux types qu'il contient et les objets créés à partir de ces types. Le Common Language Runtime ne décharge pas d'assembly tant qu'un ou plusieurs des éléments suivants existent (T correspond à tout type défini dans l'assembly) :

  • Instance de T.

  • Instance d'un tableau de T ou instance d'une collection générique qui a T comme l'un de ses arguments de type, même si ce tableau ou cette collection est vide.

  • Instance de Type ou TypeBuilder qui représente T.

RemarqueRemarque

Vous devez libérer tous les objets qui représentent des parties de l'assembly.Le ModuleBuilder qui a défini T conserve une référence au TypeBuilder, et l'objet AssemblyBuilder conserve une référence au ModuleBuilder, donc les références à ces objets doivent être libérées.Même l'existence d'un LocalBuilder ou d'un ILGenerator utilisé dans la construction de T empêche le déchargement.

  • Référence statique à T par un autre type défini dynamiquement T1 qui est encore accessible par le code d'exécution. Par exemple, T1 peut dériver de T ou T peut être le type d'un paramètre dans une méthode de T1.

  • ByRef à un champ statique qui appartient à T.

  • RuntimeTypeHandle, RuntimeFieldHandle ou RuntimeMethodHandle qui fait référence à T ou à un composant de T.

  • Instance de tout objet Reflection qui peut être utilisée directement ou indirectement pour accéder à l'objet Type représentant T. Par exemple, l'objet Type pour T peut être obtenu à partir d'un type de tableau dont le type d'élément est T, ou d'un type générique qui a T comme un argument de type.

  • Méthode M sur la pile des appels de tout thread, où M est une méthode de T ou une méthode au niveau du module définie dans l'assembly.

  • Délégué d'une méthode statique défini dans un module de l'assembly.

Si l'un des éléments de cette liste existe pour au moins un type ou une méthode dans l'assembly, le runtime ne peut pas décharger l'assembly.

RemarqueRemarque

Le runtime ne décharge pas l'assembly tant que les finaliseurs ne se sont pas exécutés pour tous les éléments de la liste.

À des fins de suivi de la durée de vie, un type générique construit tel que List<int> (List(Of Integer) en Visual Basic), qui est créé et utilisé dans la génération d'un assembly pouvant être collecté, est considéré comme ayant été défini dans l'assembly qui contient la définition de type générique ou dans un assembly contenant la définition de l'un de ses arguments de type. L'assembly exact utilisé est un détail d'implémentation et peut être modifié.

Restrictions sur les assemblys pouvant être collectés

Les restrictions suivantes s'appliquent aux assemblys pouvant être collectés :

  • Références statiques   Les types dans un assembly dynamique simple ne peuvent pas avoir de références statiques aux types définis dans un assembly pouvant être collecté. Par exemple, si vous définissez un type simple qui hérite d'un type dans un assembly pouvant être collecté, une exception NotSupportedException est levée. Un type dans un assembly pouvant être collecté peut avoir des références statiques à un type dans un autre assembly pouvant être collecté, mais cela étend la durée de vie de l'assembly référencé à la durée de vie de l'assembly de référence.

  • COM Interop   Aucune interface COM ne peut être définie dans un assembly pouvant être collecté, et aucune instance de types dans un assembly pouvant être collecté ne peut être convertie en objets COM. Un type dans un assembly pouvant être collecté ne peut pas servir de wrapper CCW (COM Callable Wrapper) ou de wrapper RCW (Runtime Callable Wrapper). Toutefois, les types dans les assemblys pouvant être collectés peuvent utiliser des objets qui implémentent des interfaces COM.

  • Appel de code non managé   Les méthodes avec l'attribut DllImportAttribute ne sont pas compilées lorsqu'elles sont déclarées dans un assembly pouvant être collecté. L'instruction OpCodes.Calli ne peut pas être utilisée dans l'implémentation d'un type contenu dans un assembly pouvant être collecté, et de tels types ne peuvent pas être marshalés en code non managé. Toutefois, vous pouvez effectuer un appel de code natif en utilisant un point d'entrée déclaré dans un assembly ne pouvant pas être collecté.

  • Marshaling   Les objets définis dans des assemblys pouvant être collectés (en particulier, les délégués) ne peuvent pas être marshalés. Cette restriction s'applique à tous les types émis transitoires.

  • Chargement d'assembly   L'émission de réflexion est le seul mécanisme pris en charge pour le chargement d'assemblys pouvant être collectés. Les assemblys chargés par toute autre forme de chargement d'assembly ne peuvent pas être déchargés.

  • Objets liés au contexte   Les variables statiques de contexte ne sont pas prises en charge. Les types contenus dans un assembly pouvant être collecté ne peuvent pas étendre ContextBoundObject. Toutefois, le code dans les assemblys pouvant être collectés peut utiliser des objets liés au contexte définis ailleurs.

  • Données statiques de thread   Les variables statiques de thread ne sont pas prises en charge.

Voir aussi

Autres ressources

Émission d'assemblys et de méthodes dynamiques