Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Počínaje .NET 10, rozhraní API System.Reflection, InvokeMember, FindMembers a DeclaredMembers používají více omezené anotace místo DynamicallyAccessedMemberTypes.All.
Tato změna má vliv na scénáře, ve kterých vývojáři implementují IReflect rozhraní nebo odvozují z TypeInfo. Předchozí použití DynamicallyAccessedMemberTypes.All bylo příliš permisivní a mohlo by vést k neočekávanému chování, jako je zachycení metod rozhraní implementovaných třídou nebo generování upozornění kvůli nebezpečným voláním reflexe.
Verze byla představena
.NET 10
Předchozí chování
Dříve používala ovlivněná rozhraní API poznámku DynamicallyAccessedMemberTypes.All , která byla příliš permisivní. To může vést k zachycení dalších členů, jako jsou metody rozhraní implementované třídou, a potenciálně způsobit upozornění během běhu nebo nebezpečná volání reflexe.
Nové chování
Ovlivněná rozhraní API teď používají omezenější anotace, které poskytují lepší kontrolu nad členy zachycenými během reflexe.
Typ zásadní změny
Tato změna je změna chování a může ovlivnit kompatibilitu zdroje.
Důvod změny
Tato změna byla zavedena za účelem zlepšení přesnosti poznámek v System.Reflection rozhraních API a řešení problémů způsobených nadměrnou DynamicallyAccessedMemberTypes.All anotací. To zajišťuje lepší kompatibilitu se scénáři oříznutí a reflexe, snižuje upozornění modulu runtime a zabraňuje nebezpečným voláním reflexe.
Doporučená akce
Pokud implementujete IReflect nebo odvozujete TypeInfo, zkontrolujte kód a aktualizujte poznámky, aby byly v souladu s novým chováním. Specifically:
Nahraďte DynamicallyAccessedMemberTypes.All poznámky více omezenými poznámkami, například DynamicallyAccessedMemberTypes.PublicMethods, DynamicallyAccessedMemberTypes.NonPublicMethodsnebo jinými vhodnými typy.
Následující fragment kódu ukazuje příklad.
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) { } }Otestujte scénáře reflexe, abyste zajistili, že aktualizované komentáře zachycují zamýšlené členy a nevyvolávají běhové chyby nebo upozornění.
Další informace o DynamicallyAccessedMembers poznámkách a jejich použití si můžete přečíst v Příprava knihoven .NET na optimalizaci.