IntPtr 不再用于函数指针类型

作为一个新的反射功能,函数指针类型现在是具有新功能(如 System.Type)的 Type.IsFunctionPointer 实例。 以前,返回的 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 预览版 2

破坏性变更的类型

此更改为行为更改

更改原因

此更改增加了获取函数指针元数据的功能,包括参数类型、返回类型和调用约定。 函数指针支持随 C# 9 和 .NET 5 一起添加,但当时未添加反射支持。

如果希望代码支持函数指针并对其进行特殊处理,请使用新的 Type.IsFunctionPointer API。

受影响的 API