Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.NET 10'dan başlayarak, System.Reflection API'ler InvokeMember, FindMembersve DeclaredMembers yerine DynamicallyAccessedMemberTypes.Alldaha kısıtlı ek açıklamalar kullanır.
Bu değişiklik, geliştiricilerin IReflect arabirimini uyguladığı veya TypeInfo'den türettiği senaryoları etkiler. Önceki kullanımı DynamicallyAccessedMemberTypes.All, gereğinden fazla izin vererek bir sınıfın uyguladığı arabirim yöntemlerini yakalama veya güvensiz yansıma çağrıları yapılarak uyarılar oluşturma gibi istenmeyen davranışlara yol açabilir.
Sürüm kullanıma sunulmuştur
.NET 10
Önceki davranış
Daha önce, etkilenen API'ler aşırı izin verici ek açıklamayı DynamicallyAccessedMemberTypes.All kullanıyorlardı. Bu, bir sınıf tarafından uygulanan arabirim yöntemleri gibi ek üyelerin yakalanmasına neden olabilir ve çalışma zamanı uyarılarına veya güvenli olmayan yansıma çağrılarına yol açabilir.
Yeni davranış
Etkilenen API'ler artık, yansıma sırasında yakalanan üyeler üzerinde daha iyi kontrol sağlayan daha kısıtlı anotasyonlar kullanıyor.
Kesinti yaratan değişiklik türü
Bu değişiklik davranışsal bir değişikliktir ve kaynak uyumluluğunu etkileyebilir.
Değişiklik nedeni
Değişiklik, API'lerdeki System.Reflection ek açıklamaların doğruluğunu geliştirmek ve aşırı izinli DynamicallyAccessedMemberTypes.All ek açıklamanın neden olduğu sorunları gidermek için kullanıma sunulmuştur. Bu, kırpma ve yansıma senaryolarıyla daha iyi uyumluluk sağlar, çalışma zamanı uyarılarını azaltır ve güvenli olmayan yansıma çağrılarını önler.
Önerilen eylem
IReflect uygulamak isterseniz veya TypeInfo sürümünden türetirseniz, kodunuzu gözden geçirin ve açıklamaları yeni davranışla uyumlu olacak şekilde güncelleştirin. Özellikle:
Ek açıklamaları daha kısıtlanmış ek açıklamalarla değiştirin, örneğin DynamicallyAccessedMemberTypes.All, DynamicallyAccessedMemberTypes.PublicMethods veya diğer uygun türler.
Aşağıdaki kod parçacığı bir örnek gösterir.
class MyType : IReflect { [DynamicallyAccessedMembers( DynamicallyAccessedMemberTypes.PublicFields | DynamicallyAccessedMemberTypes.NonPublicFields | DynamicallyAccessedMemberTypes.PublicMethods | DynamicallyAccessedMemberTypes.NonPublicMethods | DynamicallyAccessedMemberTypes.PublicProperties | DynamicallyAccessedMemberTypes.NonPublicProperties | DynamicallyAccessedMemberTypes.PublicConstructors | DynamicallyAccessedMemberTypes.NonPublicConstructors)] public object InvokeMember(string name, BindingFlags invokeAttr, Binder? binder, object? target, object?[]? args, ParameterModifier[]? modifiers, CultureInfo? culture, string[]? namedParameters) { } }Güncelleştirilmiş ek açıklamaların hedeflenen üyeleri yakaladığından ve çalışma zamanı hataları veya uyarıları sunmadığından emin olmak için yansıma senaryolarını test edin.
Ek açıklamalar ve kullanımları hakkında DynamicallyAccessedMembers daha fazla bilgi için bkz. Kırpma için .NET kitaplıklarını hazırlama.