Share via


„IntPtr“ wird nicht mehr für Funktionszeigertypen verwendet.

Als neues Reflexionsfeature ist ein Funktionszeigertyp jetzt eine System.Type-Instanz mit neuen Funktionen wie etwa Type.IsFunctionPointer. Bisher war die zurückgegebene System.Type-Instanz eine Instanz vom Typ IntPtr.

Die Verwendung von System.Type auf diese Weise ähnelt der Verfügbarmachung anderer Typen – beispielsweise Zeiger (Type.IsPointer) und Arrays (Type.IsArray).

Diese neue Funktion ist derzeit in der CoreCLR-Runtime und in MetadataLoadContext implementiert. Die Unterstützung der Mono- und NativeAOT-Runtime wird voraussichtlich später implementiert.

Eine Funktionszeigerinstanz, bei der es sich um eine physische Adresse für eine Funktion handelt, wird weiterhin als IntPtr dargestellt. Nur der Reflexionstyp wurde geändert.

Vorheriges Verhalten

Bislang wurde von typeof(delegate*<void>()) für einen Funktionszeigertyp der Typ System.IntPtr zurückgegeben. Analog dazu hat die Reflexion diesen Typ auch für einen Funktionszeigertyp zurückgegeben (beispielsweise mit FieldInfo.FieldType). Der Typ IntPtr ermöglichte keinen Zugriff auf die Parametertypen, auf den Rückgabetyp oder auf die Aufrufkonventionen.

Neues Verhalten

typeof und Reflexion verwenden jetzt System.Type für einen Funktionszeigertyp. Dies ermöglicht den Zugriff auf die Parametertypen, auf den Rückgabetyp und auf Aufrufkonventionen.

Eingeführt in Version

.NET 8 Preview 2

Typ des Breaking Changes

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Dank dieser Änderung ist es nun möglich, Funktionszeiger-Metadaten wie Parametertypen, Rückgabetyp und Aufrufkonventionen abzurufen. Die Unterstützung von Funktionszeigern wurde mit C# 9 und .NET 5 hinzugefügt. Die Reflexionsunterstützung wurde aber zu diesem Zeitpunkt nicht hinzugefügt.

Wenn Ihr Code Funktionszeiger unterstützen soll und diese Funktionszeiger speziell behandelt werden sollen, verwenden Sie die neue API Type.IsFunctionPointer.

Betroffene APIs