CA1417: Nie używaj OutAttribute parametrów ciągu dla parametrów P/Invoke

Właściwości Wartość
Identyfikator reguły CA1417
Tytuł Nie używaj OutAttribute parametrów ciągu dla parametrów P/Invoke
Kategoria Współdziałanie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako ostrzeżenie

Przyczyna

Parametr ciągu P/Invoke jest przekazywany przez wartość i oznaczony znakiem OutAttribute.

Opis reguły

Środowisko uruchomieniowe platformy .NET automatycznie wykonuje interning ciągu. Jeśli internowany ciąg oznaczony za OutAttribute pomocą jest przekazywany przez wartość do P/Invoke, środowisko uruchomieniowe może być zdestabilizować.

Jak naprawić naruszenia

Jeśli wymagane jest przeładowanie zmodyfikowanych danych ciągu z powrotem do obiektu wywołującego, przekaż ciąg przez odwołanie. OutAttribute W przeciwnym razie można je usunąć bez żadnych innych zmian.

 // 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);

Kiedy pomijać ostrzeżenia

Nie można bezpiecznie pominąć ostrzeżenia z tej reguły.

Zobacz też