Aller au contenu
EN FR

Durée de vie et libération des objets Runtime générés

Statut documentaire : architecture — voir Maturité et preuves.

Les objets .NET générés représentent des identités Runtime. Le wrapper managé et l'objet Runtime sous-jacent ont donc des durées de vie liées mais distinctes.

Libération déterministe

Lorsqu'un objet généré possède une référence Runtime libérable, le code applicatif doit la libérer de façon déterministe, de préférence via le pattern IDisposable/disposal généré lorsque le binding l'expose.

using var session = runtime.CreateSession();

Le binding généré traduit la disposal vers l'opération de release Runtime correspondante. Le code applicatif ne doit pas appeler le Free natif sur les handles d'objets.

Références locales

En exécution locale, un objet généré peut encapsuler un handle Runtime natif opaque. Le release invalide la référence Runtime possédée conformément au contrat d'ownership ABI.

Les buffers natifs temporaires utilisés pour le marshalling de chaînes ou tableaux constituent un sujet distinct de la libération des objets.

Références distantes

En exécution RPC, l'identité objet équivalente est représentée par un InstanceId distant associé aux métadonnées de type et à une session/lease. La disposal/release indique au Runtime distant que le client n'a plus besoin de cette référence.

Le modèle objet visible par l'application doit rester identique même si la représentation de transport change.

Références borrowed et owned

Toute référence retournée par un appel Runtime ne transfère pas nécessairement son ownership. Le code généré doit suivre les métadonnées d'ownership publiées au lieu de disposer indistinctement tous les handles rencontrés.

Un binding doit rendre les durées de vie owned faciles à libérer et les références borrowed difficiles à libérer par erreur.

Les finalizers ne sont pas le contrat principal

Le garbage collector peut constituer un filet de sécurité, mais les ressources Runtime déterministes ne doivent pas dépendre de la finalisation non déterministe pour leur cycle de vie normal. C'est particulièrement important pour les leases distants, les gros modèles résidents, les fichiers, les sessions et les autres ressources rares.

Après disposal

Un objet généré disposé ne doit plus être utilisé pour des appels Runtime. Le binding peut détecter cet état localement ou recevoir de l'adaptateur Runtime une erreur de référence périmée/invalide.