Partilhar via


Anotações mais restritas em InvokeMember/FindMembers/DeclaredMembers

A partir do .NET 10, as System.Reflection APIs InvokeMember, FindMemberse DeclaredMembers usam anotações mais restritas em vez de DynamicallyAccessedMemberTypes.All.

Essa alteração afeta cenários em que os desenvolvedores implementam a interface IReflect ou derivam de TypeInfo. A utilização anterior de DynamicallyAccessedMemberTypes.All era excessivamente permissiva e poderia levar a comportamentos não intencionais, como a captura de métodos de interface implementados por uma classe ou a geração de avisos devido a chamadas de reflexão insegura.

Versão introduzida

.NET 10

Comportamento anterior

Anteriormente, as APIs afetadas usavam a DynamicallyAccessedMemberTypes.All anotação, que era excessivamente permissiva. Isso pode resultar na captura de membros adicionais, como métodos de interface implementados por uma classe, e potencialmente causar avisos de tempo de execução ou chamadas de reflexão inseguras.

Novo comportamento

As APIs afetadas agora usam anotações mais restritas, que fornecem melhor controle sobre os membros capturados durante a reflexão.

Tipo de mudança disruptiva

Essa alteração é uma mudança comportamental e pode afetar a compatibilidade da fonte.

Motivo da mudança

A alteração foi introduzida para melhorar a precisão das anotações em System.Reflection APIs e para resolver problemas causados pela anotação excessivamente permissiva DynamicallyAccessedMemberTypes.All . Isto garante melhor compatibilidade com cenários de recorte e reflexão, reduz avisos durante a execução e previne chamadas de reflexão inseguras.

Se você implementar IReflect ou derivar do TypeInfo, revise seu código e atualize as anotações para alinhá-lo com o novo comportamento. Specifically:

  1. Substitua DynamicallyAccessedMemberTypes.All anotações por anotações mais restritas, como DynamicallyAccessedMemberTypes.PublicMethods, DynamicallyAccessedMemberTypes.NonPublicMethodsou outros tipos apropriados.

    O trecho de código a seguir mostra um exemplo.

    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. Testar cenários de reflexão para garantir que as anotações atualizadas captam os membros pretendidos e não introduzem erros ou avisos em tempo de execução.

Para mais informações sobre DynamicallyAccessedMembers anotações e o seu uso, consulte Preparar bibliotecas .NET para otimização.

APIs afetadas