作为一个新的反射功能,函数指针类型现在是具有新功能(如 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。