CA1417: P/Invokes için dize parametrelerinde kullanmayın OutAttribute

Özellik Değer
Kural Kimliği CA1417
Başlık P/Invokes için dize parametrelerinde kullanmayın OutAttribute
Kategori Birlikte çalışabilirlik
Hataya neden olan veya bozulmayan düzeltme Hataya neden olmayan
.NET 8'de varsayılan olarak etkin Uyarı olarak

Neden

P /Invoke dize parametresi değere göre geçirilir ve ile OutAttributeişaretlenir.

Kural açıklaması

.NET çalışma zamanı otomatik olarak dize stajyerliği gerçekleştirir. ile OutAttribute işaretlenmiş bir interned dizesi bir P/Invoke'a değer tarafından geçirilirse, çalışma zamanı dengesiz hale getirilebilir.

İhlalleri düzeltme

Değiştirilen dize verilerini çağırana yeniden sıralamak gerekiyorsa, bunun yerine dizeyi başvuruya göre geçirin. Aksi takdirde, OutAttribute başka bir değişiklik yapılmadan kaldırılabilir.

 // Violation
[DllImport("MyLibrary")]
private static extern void Foo([Out] string s);

// Fixed: passed by reference
[DllImport("MyLibrary")]
private static extern void Foo(out string s);

// Fixed: marshalling data back to caller is not required
[DllImport("MyLibrary")]
private static extern void Foo(string s);

Uyarıların ne zaman bastırılması gerekiyor?

Bu kuraldan gelen bir uyarıyı engellemek güvenli değildir.

Ayrıca bkz.