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