IntPtr больше не используется для типов указателей функций

В качестве новой функции отражения тип указателя функции теперь является экземпляром System.Type с новыми возможностями, такими как Type.IsFunctionPointer. System.Type Ранее возвращаемый экземпляр был типомIntPtr.

Использование System.Type таким образом аналогично тому, как предоставляются другие типы, такие как указатели (Type.IsPointer) и массивы (Type.IsArray).

Эта новая функция в настоящее время реализована в среде выполнения CoreCLR и в MetadataLoadContext. Поддержка сред выполнения Mono и NativeAOT ожидается позже.

Экземпляр указателя функции, который является физическим адресом функции, продолжает представляться как экземпляр IntPtr; изменился только тип отражения.

Предыдущее поведение

Ранее typeof(delegate*<void>()) возвращал тип System.IntPtr для типа указателя функции. Аналогично, рефлексия также возвращает этот тип для типа указателя функции, как в случае с FieldInfo.FieldType. Тип IntPtr не разрешал доступ к типам параметров, возвращаемым типам или соглашениям о вызовах.

Новое поведение

typeof и отражение теперь используют System.Type для типа указателя функции, который предоставляет доступ к типам параметров, возвращаемому типу и правилам вызова.

Представленная версия

.NET 8( предварительная версия 2)

Тип разрушающего изменения

Это изменение поведения.

Причина изменения

Это изменение добавляет возможность получения метаданных указателя функции, включая типы параметров, возвращаемый тип и соглашения о вызовах. Поддержка указателя функций была добавлена с помощью C# 9 и .NET 5, но поддержка отражения не была добавлена в то время.

Если вы хотите, чтобы код поддерживал указатели функций и специально обрабатывал их, используйте новый Type.IsFunctionPointer API.

Затронутые API