Udostępnij przez


Bardziej ograniczone adnotacje dotyczące elementu InvokeMember/FindMembers/DeclaredMembers

Począwszy od platformy .NET 10, interfejsy API System.Reflection, InvokeMember, FindMembers i DeclaredMembers używają bardziej ograniczonych adnotacji zamiast DynamicallyAccessedMemberTypes.All.

Ta zmiana ma wpływ na scenariusze, w których deweloperzy implementują IReflect interfejs lub dziedziczą z TypeInfo. Poprzednie użycie DynamicallyAccessedMemberTypes.All było zbyt pobłażliwe i mogło prowadzić do niezamierzonego zachowania, takiego jak przechwytywanie metod interfejsu zaimplementowanych przez klasę lub generowanie ostrzeżeń z powodu niebezpiecznych wywołań odbić.

Wersja wprowadzona

.NET 10

Poprzednie zachowanie

Wcześniej interfejsy API , których dotyczy problem, używały DynamicallyAccessedMemberTypes.All adnotacji, która była nadmiernie permisywna. Może to spowodować przechwycenie dodatkowych elementów członkowskich, takich jak metody interfejsu zaimplementowane przez klasę, i potencjalnie spowodować ostrzeżenia środowiska uruchomieniowego lub niebezpieczne wywołania odzwierciedlenia.

Nowe zachowanie

Interfejsy API, których dotyczy problem , używają teraz bardziej ograniczonych adnotacji, co zapewnia lepszą kontrolę nad elementami członkowskimi przechwytywanymi podczas odbicia.

Typ zmiany przełamującej

Ta zmiana jest zmianą behawioralną i może mieć wpływ na zgodność źródła.

Przyczyna zmiany

Wprowadzono zmianę w celu zwiększenia dokładności adnotacji w System.Reflection interfejsach API i rozwiązania problemów spowodowanych nadmierną DynamicallyAccessedMemberTypes.All adnotacją. Zapewnia to lepszą zgodność ze scenariuszami przycinania i odbicia, zmniejsza ostrzeżenia środowiska uruchomieniowego i zapobiega niebezpiecznym wywołaniom odbicia.

Jeśli implementujesz IReflect lub pochodzisz z TypeInfo, przejrzyj kod i zaktualizuj adnotacje, aby były zgodne z nowym zachowaniem. Szczególnie:

  1. Zastąp DynamicallyAccessedMemberTypes.All adnotacje bardziej ograniczonymi adnotacjami, takimi jak DynamicallyAccessedMemberTypes.PublicMethods, DynamicallyAccessedMemberTypes.NonPublicMethodslub inne odpowiednie typy.

    Poniższy fragment kodu przedstawia przykład.

    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. Przetestuj scenariusze refleksji, aby upewnić się, że zaktualizowane adnotacje uchwycają zamierzonych członków i nie powodują błędów w czasie działania ani ostrzeżeń.

Aby uzyskać więcej informacji o DynamicallyAccessedMembers adnotacjach i ich zastosowaniu, zobacz Przygotowywanie bibliotek platformy .NET do przycinania.

Interfejsy API, których dotyczy problem