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.
Action recommandée
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.