.NET 8 引入了 UnsafeAccessorAttribute 属性,该属性允许访问类型的不可见成员(也称为“快速私有反射”)。 由于时间限制,.NET 8 中没有添加对泛型的支持。 但是,在 CoreCLR 和原生 AOT 中,涉及封闭泛型类型的一些非常窄和不受支持的应用场景确实能够工作。 这些应用场景本应被阻止,但却意外地未被阻止。 .NET 9 中添加了新的限制。
有关详细信息和示例,请参阅有关 UnsafeAccessorAttribute 的注释。
旧行为
.NET 8 中实现了对类型的原生签名查找,在某些情况下,泛型类型的使用被认为是有效的。 例如,以下代码成功:
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
extern static void CtorAsMethod(List<int> c);
新行为
从 .NET 9 开始,完全受支持且记录在档的使用泛型类型的方法是确保 extern static
方法的类型参数与私有方法的类型参数匹配,并且 extern static
方法的方法参数与私有方法的方法参数匹配。 这些限制是必要的,因为运行时执行严格的元数据签名匹配。
class Accessor<T>
{
[UnsafeAccessor(UnsafeAccessorKind.Method, Name = ".ctor")]
public extern static void CtorAsMethod(List<T> c);
}
引入的版本
.NET 9 预览版 6
中断性变更的类型
此更改为行为更改。
更改原因
在官方的 .NET 8 版本中,不是有意支持 UnsafeAccessorAttribute 的泛型类型的使用。 在开发初期,它是可能受支持的应用场景,但后来被推迟到了 .NET 9,因为团队遇到了复杂性问题。 官方文档没有提及泛型,也没有提供任何使用泛型的示例。 此更改更正了该行为。
建议的操作
请阅读 UnsafeAccessorAttribute API 的更新后文档,并根据需要更改代码,以匹配泛型类型的新限制。