Compartilhar via


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

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

Essa alteração afeta cenários em que os desenvolvedores implementam a IReflect interface ou derivam de TypeInfo. O uso DynamicallyAccessedMemberTypes.All anterior era excessivamente permissivo e poderia levar a um comportamento não intencional, como capturar métodos de interface implementados por uma classe ou gerar avisos devido a chamadas de reflexão não seguras.

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 runtime ou chamadas de reflexão não seguras.

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 alteração comportamental e pode afetar a compatibilidade de origem.

Motivo da alteração

A alteração foi introduzida para melhorar a precisão das anotações nas System.Reflection APIs e resolver problemas causados pela anotação excessivamente permissiva DynamicallyAccessedMemberTypes.All . Isso garante uma melhor compatibilidade com cenários de corte e reflexão, reduz avisos de runtime e impede chamadas de reflexão não seguras.

Se você implementar IReflect ou derivar de TypeInfo, reveja seu código e atualize as anotações para se alinhar com o novo comportamento. Especificamente:

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

    O snippet 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. Teste cenários de reflexão para garantir que as anotações atualizadas capturem os membros pretendidos e não introduzam erros ou avisos de runtime.

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

APIs afetadas