Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.
Ação recomendada
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:
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) { } }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.