Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
A partir de .NET 10, las System.Reflection API InvokeMember, FindMembersy DeclaredMembers usan anotaciones más restringidas en lugar de DynamicallyAccessedMemberTypes.All.
Este cambio afecta a escenarios en los que los desarrolladores implementan la IReflect interfaz o derivan de TypeInfo. El uso anterior de DynamicallyAccessedMemberTypes.All era excesivamente permisivo y podría provocar un comportamiento no deseado, como capturar métodos de interfaz implementados por una clase o generar advertencias debido a llamadas de reflexión no seguras.
Versión introducida
.NET 10
Comportamiento anterior
Anteriormente, las API afectadas usaban la DynamicallyAccessedMemberTypes.All anotación, que era demasiado permisiva. Esto podría dar lugar a la captura de miembros adicionales, como los métodos de interfaz implementados por una clase y, posiblemente, provocar advertencias en tiempo de ejecución o llamadas de reflexión no seguras.
Nuevo comportamiento
Las API afectadas ahora usan anotaciones más restringidas, lo que proporciona un mejor control sobre los miembros capturados durante la reflexión.
Tipo de cambio disruptivo
Este cambio es un cambio de comportamiento y puede afectar a la compatibilidad de origen.
Motivo del cambio
El cambio se introdujo para mejorar la precisión de las anotaciones en System.Reflection las API y para solucionar problemas causados por la anotación excesivamente permisiva DynamicallyAccessedMemberTypes.All . Esto garantiza una mejor compatibilidad con escenarios de recorte y reflexión, reduce las advertencias en tiempo de ejecución y evita llamadas de reflexión no seguras.
Acción recomendada
Si implementa IReflect o deriva de TypeInfo, revise el código y actualice las anotaciones para alinearse con el nuevo comportamiento. Specifically:
Reemplace DynamicallyAccessedMemberTypes.All las anotaciones por anotaciones más restringidas, como DynamicallyAccessedMemberTypes.PublicMethods, DynamicallyAccessedMemberTypes.NonPublicMethodsu otros tipos adecuados.
En el fragmento de código siguiente se muestra un ejemplo.
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) { } }Pruebe los escenarios de reflexión para asegurarse de que las anotaciones actualizadas representen a los miembros previstos y no introduzcan errores o advertencias durante la ejecución.
Para obtener más información sobre DynamicallyAccessedMembers las anotaciones y su uso, consulte Preparación de bibliotecas de .NET para el recorte.