Partilhar via


IntPtr não é mais usado para tipos de ponteiro de função

Como um novo recurso de reflexão, um tipo de ponteiro de função agora é uma System.Type instância com novos recursos, como Type.IsFunctionPointer. Anteriormente, a instância retornada System.Type era do IntPtr tipo.

O uso System.Type dessa maneira é semelhante à forma como outros tipos são expostos, como ponteiros (Type.IsPointer) e matrizes (Type.IsArray).

Essa nova funcionalidade está atualmente implementada no tempo de execução do CoreCLR e no MetadataLoadContext. O suporte para os tempos de execução Mono e NativeAOT é esperado mais tarde.

Uma instância de ponteiro de função, que é um endereço físico para uma função, continua a ser representada como um IntPtr; apenas o tipo de reflexão foi alterado.

Comportamento anterior

Anteriormente, typeof(delegate*<void>()) retornava o System.IntPtr tipo para um tipo de ponteiro de função. Da mesma forma, a reflexão também retornou esse tipo para um tipo de ponteiro de função, como com FieldInfo.FieldType. O IntPtr tipo não permitia nenhum acesso aos tipos de parâmetro, tipo de retorno ou convenções de chamada.

Novo comportamento

typeof e reflexão agora usado System.Type para um tipo de ponteiro de função, que fornece acesso aos tipos de parâmetro, tipo de retorno e convenções de chamada.

Versão introduzida

.NET 8 Visualização 2

Tipo de mudança de rutura

Esta mudança é uma mudança comportamental.

Razão para a alteração

Essa alteração adiciona a capacidade de obter metadados de ponteiro de função, incluindo tipos de parâmetro, o tipo de retorno e as convenções de chamada. O suporte ao ponteiro de função foi adicionado com C# 9 e .NET 5, mas o suporte à reflexão não foi adicionado naquele momento.

Se você quiser que seu código ofereça suporte a ponteiros de função e os trate de forma especial, use a nova Type.IsFunctionPointer API.

APIs afetadas