Ostrzeżenie CA1417: OutAttribute w parametrze ciągu dla P/Invoke
Reguła analizatora kodu platformy .NET CA1417 jest domyślnie włączona, począwszy od platformy .NET 5. Tworzy ostrzeżenie kompilacji dla dowolnej definicji metody Platform Invoke (P/Invoke), gdzie String parametr jest przekazywany przez wartość i oznaczony za pomocą OutAttribute.
Opis zmiany
Począwszy od platformy .NET 5, zestaw .NET SDK zawiera analizatory kodu źródłowego platformy .NET. Kilka z tych reguł jest domyślnie włączonych, w tym CA1417. Jeśli projekt zawiera kod, który narusza tę regułę i jest skonfigurowany do traktowania ostrzeżeń jako błędów, ta zmiana może spowodować przerwanie kompilacji.
Reguła CA1417 flaguje definicje metod P/Invoke , w których String parametr jest oznaczony atrybutem OutAttribute i jest przekazywany przez wartość. Na przykład:
[DllImport("MyLibrary")]
private static extern void PIMethod([Out] string s);
Środowisko uruchomieniowe platformy .NET obsługuje tabelę nazywaną pulą intern, która zawiera pojedyncze odwołanie do każdego unikatowego ciągu literału w programie. Jeśli internowany ciąg oznaczony za OutAttribute pomocą jest przekazywany przez wartość do metody P/Invoke, środowisko uruchomieniowe może być zdestabilizować. Aby uzyskać więcej informacji na temat interningu ciągów, zobacz uwagi dotyczące elementu String.Intern(String).
Wprowadzona wersja
5,0
Zalecana akcja
Jeśli musisz przeprowadzić marshaling zmodyfikowanych danych ciągu z powrotem do obiektu wywołującego, przekaż ciąg przy użyciu odwołania.
[DllImport("MyLibrary")] private static extern void PIMethod(out string s);
Jeśli nie musisz marshalingować zmodyfikowanych danych ciągu z powrotem do obiektu wywołującego, po prostu usuń element OutAttribute.
[DllImport("MyLibrary")] private static extern void PIMethod(string s);
Aby uzyskać więcej informacji, zobacz CA1417.
Aby całkowicie wyłączyć analizę kodu, ustaw wartość
EnableNETAnalyzers
nafalse
w pliku projektu. Aby uzyskać więcej informacji, zobacz EnableNETAnalyzers.
Dotyczy interfejsów API
Nie można wykryć za pośrednictwem analizy interfejsu API.