Compartilhar 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 instância System.Type com novos recursos, como Type.IsFunctionPointer. Anteriormente, a instância System.Type retornada era o tipo IntPtr.

Usar System.Type dessa maneira é semelhante a como outros tipos são expostos, como ponteiros (Type.IsPointer) e matrizes (Type.IsArray).

Atualmente, essa nova funcionalidade é implementada apenas no runtime do CoreCLR e no MetadataLoadContext. O suporte para os runtimes Mono e NativeAOT é esperado posteriormente.

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 mudou.

Comportamento anterior

Anteriormente, typeof(delegate*<void>()) retornava o tipo System.IntPtr 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 tipo IntPtr não permitia acesso aos tipos de parâmetro, tipo de retorno ou convenções de chamada.

Novo comportamento

typeof e reflexão agora usam 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 Preview 2

Tipo de alteração interruptiva

Esta é uma alteração comportamental.

Motivo da 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 o C# 9 e o .NET 5, mas o suporte à reflexão não foi adicionado naquele momento.

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

APIs afetadas