Warnung CA1417: OutAttribute für Zeichenfolgenparameter für P/Invoke

Die .NET-Codeanalyseregel CA1417 ist ab .NET 5 standardmäßig aktiviert. Sie erzeugt eine Buildwarnung für alle Methodendefinitionen für Plattformaufrufe (P/Invoke), bei denen ein String-Parameter im Wert übergeben und mit OutAttribute gekennzeichnet wird.

Änderungsbeschreibung

Ab .NET 5 umfasst das .NET SDK .NET-Quellcodeanalysen. Einige dieser Regeln, darunter CA1417, sind standardmäßig aktiviert. Wenn Ihr Projekt Code enthält, der gegen diese Regel verstößt und dafür konfiguriert ist, Warnungen als Fehler zu interpretieren, könnte es sich hierbei um einen Breaking Change für Ihr Build handeln.

Die Regel CA1417 kennzeichnet P/Invoke-Methodendefinitionen, bei denen ein String-Parameter mit dem Attribut OutAttribute gekennzeichnet und im Wert übergeben wird. Beispiel:

[DllImport("MyLibrary")]
private static extern void PIMethod([Out] string s);

Die .NET-Runtime verwaltet eine als Internpool bezeichnete Tabelle, die einen einzelnen Verweis auf jedes eindeutige Zeichenfolgenliteral in einem Programm enthält. Wenn eine mit OutAttribute gekennzeichnete internalisierte Zeichenfolge im Wert an eine P/Invoke-Methode übergeben wird, kann die Runtime destabilisiert werden. Weitere Informationen zur Internalisierung von Zeichenfolgen finden Sie in den Hinweisen zu String.Intern(String).

Eingeführt in Version

5.0

  • Wenn Sie geänderte Zeichenfolgendaten zurück zum Aufrufer marshallen müssen, übergeben Sie die Zeichenfolge stattdessen in einem Verweis.

    [DllImport("MyLibrary")]
    private static extern void PIMethod(out string s);
    
  • Wenn Sie geänderte Zeichenfolgendaten nicht zurück zum Aufrufer marshallen müssen, entfernen Sie einfach OutAttribute.

    [DllImport("MyLibrary")]
    private static extern void PIMethod(string s);
    

    Weitere Informationen finden Sie unter CA1417.

  • Legen Sie EnableNETAnalyzers in Ihrer Projektdatei auf false fest, um die Codeanalyse vollständig zu deaktivieren. Weitere Informationen finden unter EnableNETAnalyzers.

Betroffene APIs

Nicht über API-Analyse erkennbar.