Condividi tramite


IntPtr non viene più usato per i tipi di puntatore a funzione

Come nuova funzionalità di reflection, un tipo di puntatore a funzione è ora un'istanza System.Type con nuove funzionalità, ad esempio Type.IsFunctionPointer. In precedenza, l'istanza System.Type restituita era il tipo IntPtr.

L'uso di System.Type in questo modo è simile alla modalità di esposizione di altri tipi, ad esempio puntatori (Type.IsPointer) e matrici (Type.IsArray).

Questa nuova funzionalità è attualmente implementata nel runtime CoreCLR e in MetadataLoadContext. Il supporto per i runtime Mono e NativeAOT è previsto in un secondo momento.

Un'istanza del puntatore di funzione, ovvero un indirizzo fisico a una funzione, continua a essere rappresentata come un oggetto IntPtr. Solo il tipo di reflection è stato modificato.

Comportamento precedente

In precedenza, typeof(delegate*<void>()) ha restituito il tipo System.IntPtr per un tipo di puntatore a funzione. Analogamente, la reflection ha restituito anche questo tipo per un tipo di puntatore a funzione, ad esempio con FieldInfo.FieldType. Il tipo IntPtr non ha consentito l'accesso ai tipi di parametro, al tipo restituito o alle convenzioni di chiamata.

Nuovo comportamento

typeof e reflection ora usano System.Type per un tipo di puntatore a funzione, che fornisce l'accesso ai tipi di parametro, al tipo restituito e alle convenzioni di chiamata.

Versione introdotta

.NET 8 Preview 2

Tipo di modifica che causa un'interruzione

Questa è una modifica funzionale.

Motivo della modifica

Questa modifica aggiunge la funzionalità per ottenere metadati del puntatore a funzione, inclusi i tipi di parametro, il tipo restituito e le convenzioni di chiamata. Il supporto del puntatore a funzione è stato aggiunto con C# 9 e .NET 5, ma il supporto della reflection non è stato aggiunto in quel momento.

Se si vuole che il codice supporti i puntatori a funzione e li consideri in modo speciale, usare la nuova API Type.IsFunctionPointer.

API interessate