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 désormais une instance de System.Type avec de nouvelles fonctionnalités telles que Type.IsFunctionPointer. Auparavant, l’instance de System.Type retournée correspondait au type IntPtr.

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

Cette nouvelle fonctionnalité est implémentée dans le runtime CoreCLR et dans MetadataLoadContext. La prise en charge des runtimes Mono et NativeAOT est prévue pour plus tard.

Une instance de pointeur de fonction, qui est une adresse physique d’une fonction, continue d’être représentée sous la forme d’un 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 type IntPtr n’autorisait aucun accès aux types de paramètre, au type de retour ou aux conventions d’appel.

Nouveau comportement

typeof et la réflexion utilisent désormais System.Type pour un type pointeur de fonction, qui permet d’accéder aux types de paramètre, 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 du changement

Ce changement ajoute la possibilité d’obtenir des métadonnées de pointeur de fonction, notamment les types de paramètre, le type de retour et les conventions d’appel. La prise en charge des pointeurs de fonction a été ajoutée dans C# 9 et .NET 5, mais ce n’est pas le cas de la réflexion.

Si vous souhaitez que votre code prenne en charge les pointeurs de fonction et les traite de manière particulière, utilisez la nouvelle API Type.IsFunctionPointer.

API affectées