Бөлісу құралы:


Дополнительные ограниченные заметки в InvokeMember/FindMembers/DeclaredMembers

Начиная с .NET 10, System.Reflection, InvokeMember и FindMembers API, а также DeclaredMembers, используют более ограниченные аннотации вместо того, чтобы использовать DynamicallyAccessedMemberTypes.All.

Это изменение влияет на сценарии, когда разработчики реализуют интерфейс IReflect или наследуются от TypeInfo. Предыдущее использование DynamicallyAccessedMemberTypes.All было чрезмерно разрешающим и могло привести к непреднамеренному поведению, например, захват интерфейсных методов, реализованных классом, или вызывать предупреждения из-за небезопасных вызовов отражения.

Представленная версия

.NET 10

Предыдущее поведение

Ранее затронутые API использовали аннотацию DynamicallyAccessedMemberTypes.All, которая была чрезмерно допускающей. Это может привести к захвату дополнительных элементов, таких как методы интерфейса, реализованные классом, и потенциально вызывают предупреждения среды выполнения или небезопасные вызовы отражения.

Новое поведение

Затронутые API теперь используют более ограниченные аннотации, которые обеспечивают лучший контроль над элементами, захваченными во время отражения.

Тип разрушающего изменения

Это изменение является изменением поведения и может повлиять на совместимость источников.

Причина изменения

Это изменение было введено для повышения точности аннотаций в System.Reflection API и устранения проблем, вызванных слишком разрешительной DynamicallyAccessedMemberTypes.All аннотацией. Это обеспечивает лучшую совместимость с сценариями обрезки и отражения, снижает предупреждения среды выполнения и предотвращает небезопасные вызовы отражения.

При реализации IReflect или наследовании от TypeInfo просмотрите код и обновите аннотации, чтобы соответствовать новому поведению. Specifically:

  1. Замените DynamicallyAccessedMemberTypes.All аннотации более ограниченными аннотациями, например DynamicallyAccessedMemberTypes.PublicMethods, DynamicallyAccessedMemberTypes.NonPublicMethods или другими соответствующими типами.

    В следующем фрагменте кода показан пример.

    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. Протестируйте сценарии отражения, чтобы обновленные аннотации отражали целевые элементы и не вводили ошибок времени выполнения или предупреждений.

Дополнительные сведения об аннотациях и их использовании см. в DynamicallyAccessedMembers разделе «Подготовка библиотек .NET для обрезки».

Затронутые API