Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Począwszy od platformy .NET 10, interfejsy API System.Reflection, InvokeMember, FindMembers i DeclaredMembers używają bardziej ograniczonych adnotacji zamiast DynamicallyAccessedMemberTypes.All.
Ta zmiana ma wpływ na scenariusze, w których deweloperzy implementują IReflect interfejs lub dziedziczą z TypeInfo. Poprzednie użycie DynamicallyAccessedMemberTypes.All było zbyt pobłażliwe i mogło prowadzić do niezamierzonego zachowania, takiego jak przechwytywanie metod interfejsu zaimplementowanych przez klasę lub generowanie ostrzeżeń z powodu niebezpiecznych wywołań odbić.
Wersja wprowadzona
.NET 10
Poprzednie zachowanie
Wcześniej interfejsy API , których dotyczy problem, używały DynamicallyAccessedMemberTypes.All adnotacji, która była nadmiernie permisywna. Może to spowodować przechwycenie dodatkowych elementów członkowskich, takich jak metody interfejsu zaimplementowane przez klasę, i potencjalnie spowodować ostrzeżenia środowiska uruchomieniowego lub niebezpieczne wywołania odzwierciedlenia.
Nowe zachowanie
Interfejsy API, których dotyczy problem , używają teraz bardziej ograniczonych adnotacji, co zapewnia lepszą kontrolę nad elementami członkowskimi przechwytywanymi podczas odbicia.
Typ zmiany przełamującej
Ta zmiana jest zmianą behawioralną i może mieć wpływ na zgodność źródła.
Przyczyna zmiany
Wprowadzono zmianę w celu zwiększenia dokładności adnotacji w System.Reflection interfejsach API i rozwiązania problemów spowodowanych nadmierną DynamicallyAccessedMemberTypes.All adnotacją. Zapewnia to lepszą zgodność ze scenariuszami przycinania i odbicia, zmniejsza ostrzeżenia środowiska uruchomieniowego i zapobiega niebezpiecznym wywołaniom odbicia.
Zalecana akcja
Jeśli implementujesz IReflect lub pochodzisz z TypeInfo, przejrzyj kod i zaktualizuj adnotacje, aby były zgodne z nowym zachowaniem. Szczególnie:
Zastąp DynamicallyAccessedMemberTypes.All adnotacje bardziej ograniczonymi adnotacjami, takimi jak DynamicallyAccessedMemberTypes.PublicMethods, DynamicallyAccessedMemberTypes.NonPublicMethodslub inne odpowiednie typy.
Poniższy fragment kodu przedstawia przykład.
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) { } }Przetestuj scenariusze refleksji, aby upewnić się, że zaktualizowane adnotacje uchwycają zamierzonych członków i nie powodują błędów w czasie działania ani ostrzeżeń.
Aby uzyskać więcej informacji o DynamicallyAccessedMembers adnotacjach i ich zastosowaniu, zobacz Przygotowywanie bibliotek platformy .NET do przycinania.