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 预览版 2

中断性变更的类型

此更改为行为更改

更改原因

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

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

受影响的 API