Aracılığıyla paylaş


InvokeMember/FindMembers/DeclaredMembers üzerinde daha kısıtlı ek açıklamalar

.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.

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:

  1. 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)
         { }
    }
    
  2. 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.

Etkilenen API'ler