Další omezené poznámky pro InvokeMember/FindMembers/DeclaredMembers

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.

Pokud implementujete IReflect nebo odvozujete TypeInfo, zkontrolujte kód a aktualizujte poznámky, aby byly v souladu s novým chováním. Specifically:

  1. 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)
         { }
    }
    
  2. 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.

Ovlivněná rozhraní API