Udostępnij za pośrednictwem


CA1417: Nie używaj OutAttribute na parametrach typu string 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 łamiąca lub nienaruszająca Niezgodność
Domyślnie włączone na platformie .NET 10 Jako ostrzeżenie
Zastosowane języki C# i Visual Basic

Przyczyna

Parametr typu string P/Invoke jest przekazywany przez wartość i oznaczony jako OutAttribute.

Opis reguły

Środowisko uruchomieniowe platformy .NET automatycznie wykonuje internowanie ciągów. Jeśli internowany ciąg oznaczony za pomocą OutAttribute jest przekazywany przez wartość do P/Invoke, środowisko uruchomieniowe może zostać zdestabilizowane.

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 jest bezpieczne pominięcie ostrzeżenia z tej reguły.

Zobacz też