.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에 대한 업데이트된 설명서를 읽고 제네릭 형식에 대한 새로운 제한과 일치하도록 필요에 따라 코드를 변경합니다.
영향을 받는 API
.NET