Partager via


IntPtr n’est plus utilisé pour les types de pointeur de fonction

En tant que nouvelle fonctionnalité de réflexion, un type de pointeur de fonction est maintenant une System.Type instance avec de nouvelles fonctionnalités telles que Type.IsFunctionPointer. Auparavant, l’instance System.Type retournée était le IntPtr type.

L’utilisation System.Type de cette façon est similaire à la façon dont d’autres types sont exposés, tels que les pointeurs (Type.IsPointer) et les tableaux (Type.IsArray).

Cette nouvelle fonctionnalité est actuellement implémentée dans le runtime CoreCLR et dans MetadataLoadContext. La prise en charge des runtimes Mono et NativeAOT est attendue ultérieurement.

Une instance de pointeur de fonction, qui est une adresse physique à une fonction, continue d’être représentée en tant que IntPtr; seul le type de réflexion a changé.

Comportement précédent

Auparavant, typeof(delegate*<void>()) retournait le type System.IntPtr pour un type de pointeur de fonction. De même, la réflexion a également retourné ce type pour un type de pointeur de fonction, par exemple avec FieldInfo.FieldType. Le IntPtr type n’a autorisé aucun accès aux types de paramètres, au type de retour ou aux conventions d’appel.

Nouveau comportement

typeof et la réflexion utilisent désormais System.Type pour un type de pointeur de fonction, fournissant l’accès aux types de paramètres, au type de retour et aux conventions d'appel.

Version introduite

.NET 8 Preview 2

Type de changement cassant

Ce changement est un changement de comportement.

Raison de la modification

Cette modification ajoute la possibilité d’obtenir des métadonnées de pointeur de fonction, notamment les types de paramètres, le type de retour et les conventions d’appel. La prise en charge des pointeurs de fonction a été ajoutée avec C# 9 et .NET 5, mais la prise en charge de la réflexion n’a pas été ajoutée à ce moment-là.

Si vous souhaitez que votre code prend en charge les pointeurs de fonction et les traite spécialement, utilisez la nouvelle Type.IsFunctionPointer API.

API affectées