Freigeben über


Weitere eingeschränkte Anmerkungen für InvokeMember/FindMembers/DeclaredMembers

Ab .NET 10 verwenden die System.Reflection APIs InvokeMember, FindMembers und DeclaredMembers anstelle von DynamicallyAccessedMemberTypes.All mehr eingeschränkte Anmerkungen.

Diese Änderung wirkt sich auf Szenarien aus, in denen Entwickler die IReflect Schnittstelle implementieren oder von TypeInfodieser abgeleitet werden. Die vorherige Verwendung von DynamicallyAccessedMemberTypes.All war übermäßig freizügig und konnte zu unbeabsichtigtem Verhalten führen, wie zum Beispiel das Erfassen von Schnittstellenmethoden, die von einer Klasse implementiert wurden, oder das Generieren von Warnungen aufgrund unsicherer Reflexionsaufrufe.

Eingeführt in Version

.NET 10

Vorheriges Verhalten

Zuvor verwendeten die betroffenen APIs die DynamicallyAccessedMemberTypes.All Anmerkung, die übermäßig zulässig war. Dies kann dazu führen, dass zusätzliche Member erfasst werden, z. B. Schnittstellenmethoden, die von einer Klasse implementiert werden, und möglicherweise Laufzeitwarnungen oder unsichere Spiegelungsaufrufe verursachen.

Neues Verhalten

Die betroffenen APIs verwenden jetzt eingeschränktere Anmerkungen, die eine bessere Kontrolle über die während der Spiegelung erfassten Member bieten.

Art der einschneidenden Änderung

Diese Änderung ist eine Verhaltensänderung und kann sich auf die Quellkompatibilität auswirken.

Grund für Änderung

Die Änderung wurde eingeführt, um die Genauigkeit von Anmerkungen in System.Reflection APIs zu verbessern und Probleme zu beheben, die durch die übermäßig zulässige DynamicallyAccessedMemberTypes.All Anmerkung verursacht wurden. Dadurch wird eine bessere Kompatibilität mit Trimming- und Spiegelungsszenarien gewährleistet, Laufzeitwarnungen reduziert und unsichere Spiegelungsaufrufe verhindert.

Wenn Sie IReflect implementieren oder von TypeInfo ableiten, überprüfen Sie Ihren Code und aktualisieren Sie die Anmerkungen, um sich an das neue Verhalten anzupassen. Speziell:

  1. Ersetzen Sie DynamicallyAccessedMemberTypes.All Anmerkungen durch eingeschränktere Anmerkungen wie DynamicallyAccessedMemberTypes.PublicMethods, DynamicallyAccessedMemberTypes.NonPublicMethods oder andere geeignete Formate.

    Der folgende Codeausschnitt zeigt ein Beispiel.

    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. Testen Sie Reflexionsszenarien, um sicherzustellen, dass die aktualisierten Anmerkungen die beabsichtigten Mitglieder erfassen und keine Laufzeitfehler oder Warnungen verursachen.

Weitere Informationen zu DynamicallyAccessedMembers Anmerkungen und deren Verwendung finden Sie unter Vorbereiten von .NET-Bibliotheken zum Kürzen.

Betroffene APIs