IntPtr が関数ポインター型に使用されなくなりました
新しいリフレクション機能として、関数ポインター型は、Type.IsFunctionPointer などの新しい機能を持つ System.Type インスタンスになりました。 以前は、返された 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 Preview 2
破壊的変更の種類
この変更は、動作変更です。
変更理由
この変更により、パラメーター型、戻り値の型、呼び出し規則などの関数ポインター メタデータを取得する機能が追加されます。 関数ポインターのサポートは C# 9 と .NET 5 で追加されましたが、その時点ではリフレクションのサポートは追加されませんでした。
推奨アクション
コードで関数ポインターをサポートし、それらを特別に扱う場合は、新しい Type.IsFunctionPointer API を使用します。
影響を受ける API
.NET