Partager via


Annotations plus restreintes sur InvokeMember/FindMembers/DeclaredMembers

À partir de .NET 10, les System.Reflection API InvokeMember, FindMembers et DeclaredMembers utilisent des annotations plus restreintes au lieu de DynamicallyAccessedMemberTypes.All.

Cette modification affecte les scénarios dans lesquels les développeurs implémentent l’interface IReflect ou dérivent de TypeInfo. L’utilisation DynamicallyAccessedMemberTypes.All précédente était trop permissive et pourrait entraîner un comportement inattendu, comme la capture de méthodes d’interface implémentées par une classe ou la génération d’avertissements en raison d’appels de réflexion non sécurisés.

Version introduite

.NET 10

Comportement précédent

Auparavant, les API affectées utilisaient l’annotation DynamicallyAccessedMemberTypes.All , qui était trop permissive. Cela peut entraîner la capture de membres supplémentaires, tels que les méthodes d’interface implémentées par une classe, et entraîner des avertissements d’exécution ou des appels de réflexion non sécurisés.

Nouveau comportement

Les API affectées utilisent désormais des annotations plus restreintes, ce qui offre un meilleur contrôle sur les membres capturés pendant la réflexion.

Type de changement cassant

Cette modification est un changement comportemental et peut affecter la compatibilité de la source.

Raison de la modification

La modification a été introduite pour améliorer la précision des annotations dans System.Reflection les API et résoudre les problèmes causés par l’annotation trop permissive DynamicallyAccessedMemberTypes.All . Cela garantit une meilleure compatibilité avec les scénarios de découpage et de réflexion, réduit les avertissements d’exécution et empêche les appels de réflexion non sécurisés.

Si vous implémentez IReflect ou dérivez de TypeInfo, passez votre code en revue et mettez à jour les annotations pour vous aligner sur le nouveau comportement. Plus précisément :

  1. Remplacez DynamicallyAccessedMemberTypes.All les annotations par des annotations plus restreintes, telles que DynamicallyAccessedMemberTypes.PublicMethods, DynamicallyAccessedMemberTypes.NonPublicMethodsou d’autres types appropriés.

    L’extrait de code suivant montre un exemple.

    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. Testez les scénarios de réflexion pour vous assurer que les annotations mises à jour capturent les membres cibles et n’introduisent pas d’erreurs d'exécution ou d’avertissements.

Pour plus d’informations sur DynamicallyAccessedMembers les annotations et leur utilisation, consultez Préparation des bibliothèques .NET pour la réduction.

API affectées