Udostępnij za pośrednictwem


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

  • 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 na false w pliku projektu. Aby uzyskać więcej informacji, zobacz EnableNETAnalyzers.

Dotyczy interfejsów API

Nie można wykryć za pośrednictwem analizy interfejsu API.