已改變封閉式泛型的 UnsafeAccessor 支援
.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 Preview 6
中斷性變更的類型
此變更為行為變更。
變更原因
在官方 .NET 8 版本中,支援搭配 UnsafeAccessorAttribute 使用泛型型別是偶然的。 在開發初期,這是可能支援的案例,但後來延遲到 .NET 9,因為小組遇到複雜度問題。 官方文件並未提及泛型,也沒有提供任何使用泛型的範例。 這項變更會更正行為。
建議的動作
閱讀 UnsafeAccessorAttribute API 的已更新文件,並視需要變更您的程式碼,以符合泛型型別的新限制。