Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Mulai dari .NET 10, System.Reflection API InvokeMember, , FindMembersdan DeclaredMembers menggunakan anotasi yang lebih terbatas alih-alih DynamicallyAccessedMemberTypes.All.
Perubahan ini memengaruhi skenario di mana pengembang mengimplementasikan IReflect antarmuka atau berasal dari TypeInfo. Penggunaan DynamicallyAccessedMemberTypes.All sebelumnya terlalu permisif dan dapat menyebabkan perilaku yang tidak diinginkan, seperti menangkap metode antarmuka yang diterapkan oleh kelas atau menghasilkan peringatan karena panggilan refleksi yang tidak aman.
Versi yang diperkenalkan
.NET 10
Perilaku sebelumnya
Sebelumnya, API yang dipengaruhi menggunakan anotasi DynamicallyAccessedMemberTypes.All, yang terlalu permisif. Hal ini dapat mengakibatkan pengambilan anggota tambahan, seperti metode antarmuka yang diterapkan oleh kelas, dan berpotensi menyebabkan peringatan runtime atau panggilan pantulan yang tidak aman.
Perilaku baru
API yang terpengaruh sekarang menggunakan anotasi yang lebih terbatas, yang memberikan kontrol yang lebih baik atas elemen yang ditangkap selama refleksi.
Jenis perubahan yang memutus kompatibilitas
Perubahan ini adalah perubahan perilaku dan dapat memengaruhi kompatibilitas sumber.
Alasan perubahan
Perubahan ini diperkenalkan untuk meningkatkan akurasi anotasi dalam System.Reflection API dan untuk mengatasi masalah yang disebabkan oleh anotasi yang terlalu permisif DynamicallyAccessedMemberTypes.All . Ini memastikan kompatibilitas yang lebih baik dengan skenario pemangkasan dan refleksi, mengurangi peringatan runtime, dan mencegah panggilan refleksi yang tidak aman.
Tindakan yang direkomendasikan
Jika Anda menerapkan IReflect atau memperoleh dari TypeInfo, tinjau kode Anda dan perbarui anotasi untuk menyelaraskan dengan perilaku baru. Khususnya:
Ganti DynamicallyAccessedMemberTypes.All anotasi dengan anotasi yang lebih terbatas, seperti DynamicallyAccessedMemberTypes.PublicMethods, , DynamicallyAccessedMemberTypes.NonPublicMethodsatau jenis lain yang sesuai.
Cuplikan kode berikut menunjukkan contoh.
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) { } }Uji skenario refleksi untuk memastikan bahwa anotasi yang diperbarui mengidentifikasi anggota yang dimaksud dan tidak menimbulkan kesalahan runtime atau peringatan.
Untuk informasi lebih lengkap tentang DynamicallyAccessedMembers anotasinya dan cara penggunaannya, lihat Menyiapkan pustaka .NET untuk pengurangan.