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。