Bagikan melalui


Peringatan CA1417: OutAttribute pada parameter string untuk P/Invoke

Aturan penganalisis kode .NET CA1417 diaktifkan, secara default, dimulai di .NET 5. Ini menghasilkan peringatan build untuk definisi metode Platform Invoke (P/Invoke) di mana String parameter diteruskan oleh nilai dan ditandai dengan OutAttribute.

Deskripsi perubahan

Mulai dari .NET 5, .NET SDK menyertakan penganalisis kode sumber .NET. Beberapa aturan ini diaktifkan, secara default, termasuk CA1417. Jika proyek Anda berisi kode yang melanggar aturan ini dan dikonfigurasi untuk memperlakukan peringatan sebagai kesalahan, perubahan ini dapat merusak build Anda.

Aturan CA1417 menandai definisi metode P/Invoke di mana String parameter ditandai dengan OutAttribute atribut dan diteruskan oleh nilai. Misalnya:

[DllImport("MyLibrary")]
private static extern void PIMethod([Out] string s);

Runtime .NET mempertahankan tabel, yang disebut kumpulan magang, yang berisi referensi tunggal untuk setiap string literal unik dalam program. Jika string magang yang ditandai dengan OutAttribute diteruskan oleh nilai ke metode P/Invoke, runtime dapat didestabilisasi. Untuk informasi selengkapnya tentang interning string, lihat komentar untuk String.Intern(String).

Versi yang diperkenalkan

5.0

  • Jika Anda perlu memodifikasi data string yang dimodifikasi secara marshal kembali ke pemanggil, teruskan string berdasarkan referensi sebagai gantinya.

    [DllImport("MyLibrary")]
    private static extern void PIMethod(out string s);
    
  • Jika Anda tidak perlu memodifikasi data string yang dimodifikasi marshal kembali ke pemanggil, cukup hapus OutAttribute.

    [DllImport("MyLibrary")]
    private static extern void PIMethod(string s);
    

    Untuk informasi selengkapnya, lihat CA1417.

  • Untuk menonaktifkan analisis kode sepenuhnya, atur EnableNETAnalyzers ke false dalam file proyek Anda. Untuk informasi selengkapnya, lihat EnableNETAnalyzers.

API yang Terpengaruh

Tidak terdeteksi melalui analisis API.