.NET 10 以降では、 System.Reflection API InvokeMember、 FindMembers、 DeclaredMembers では、 DynamicallyAccessedMemberTypes.Allではなく、より制限された注釈が使用されます。
この変更は、開発者が IReflect インターフェイスを実装したり、 TypeInfoから派生したりするシナリオに影響します。 以前の DynamicallyAccessedMemberTypes.All の使用は過度に制限されており、クラスによって実装されたインターフェイス メソッドのキャプチャや、安全でないリフレクション呼び出しによる警告の生成など、意図しない動作につながる可能性があります。
導入されたバージョン
.NET 10
以前の動作
以前は、影響を受ける API はDynamicallyAccessedMemberTypes.All注釈を使用していましたが、これは過度に制限されていました。 これにより、クラスによって実装されたインターフェイス メソッドなどの追加のメンバーがキャプチャされ、ランタイム警告や安全でないリフレクション呼び出しが発生する可能性があります。
新しい動作
影響を受ける API では、より制限された注釈が使用されるようになりました。これにより、リフレクション中にキャプチャされたメンバーをより適切に制御できます。
破壊的変更の種類
この変更は 動作の変更 であり、 ソースの互換性に影響する可能性があります。
変更の理由
この変更は、 System.Reflection API の注釈の精度を向上させ、過度に許容されない DynamicallyAccessedMemberTypes.All 注釈によって発生する問題に対処するために導入されました。 これにより、トリミングとリフレクションのシナリオとの互換性が向上し、実行時の警告が減り、安全でないリフレクション呼び出しが防止されます。
推奨されるアクション
IReflectを実装する場合、またはTypeInfoから派生する場合は、コードを確認し、新しい動作に合わせて注釈を更新します。 Specifically:
DynamicallyAccessedMemberTypes.All注釈を、DynamicallyAccessedMemberTypes.PublicMethods、DynamicallyAccessedMemberTypes.NonPublicMethods、その他の適切な型など、より制限された注釈に置き換えます。
次のコード スニペットは、例を示しています。
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) { } }リフレクション シナリオをテストして、更新された注釈によって目的のメンバーがキャプチャされ、実行時エラーや警告が発生しないことを確認します。
DynamicallyAccessedMembers注釈とその使用方法の詳細については、「トリミングのための .NET ライブラリの準備」を参照してください。
影響を受ける API
.NET