Partager via


Avertissement CA1417 : OutAttribute sur le paramètre de chaîne pour P/Invoke

La règle d’analyseur de code .NET CA1417 est activée par défaut à compter de .NET 5. Elle génère un avertissement de build pour toutes les définitions de méthode Appel de code non managé (P/Invoke) où un paramètre String est passé par valeur et marqué avec OutAttribute.

Description de la modification

À compter de .NET 5, le Kit de développement logiciel (SDK) .NET inclut des analyseurs de code source .NET. Plusieurs de ces règles sont activées par défaut, y compris CA1417. Si votre projet contient du code qui enfreint cette règle et est configuré pour traiter les avertissements comme des erreurs, ce changement peut casser votre build.

La règle CA1417 signale les définitions de méthode P/Invoke où un paramètre String est marqué avec l’attribut OutAttribute et est passé par valeur. Par exemple :

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

Le runtime .NET gère une table, appelée pool interne, qui contient une référence unique à chaque chaîne littérale unique dans un programme. Si une chaîne internée marquée avec OutAttribute est passée par valeur à une méthode P/Invoke, le runtime peut être déstabilisé. Pour plus d’informations sur la centralisation de chaînes, consultez les remarques relatives à String.Intern(String).

Version introduite

5,0

  • Si vous devez marshaler les données de chaîne modifiées à l’appelant, transmettez plutôt la chaîne par référence.

    [DllImport("MyLibrary")]
    private static extern void PIMethod(out string s);
    
  • Si vous n’avez pas besoin de marshaler les données de chaîne modifiées vers l’appelant, supprimez simplement le OutAttribute.

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

    Pour plus d’informations, consultez CA1417.

  • Pour désactiver complètement l’analyse du code, définissez EnableNETAnalyzers sur false dans votre fichier projet. Pour plus d’informations, consultez EnableNETAnalyzers.

API affectées

Non détectable via l’analyse des API.