Avviso CA1417: OutAttribute nel parametro stringa per P/Invoke

La regola dell'analizzatore del codice .NET CA1417 è abilitata, per impostazione predefinita, a partire da .NET 5. Genera un avviso di compilazione per qualsiasi definizione di metodo Platform Invoke (P/Invoke) in cui un parametro String viene passato per valore e contrassegnato con OutAttribute.

Descrizione delle modifiche

A partire da .NET 5, .NET SDK include analizzatori del codice sorgente .NET. Alcune di queste regole sono abilitate, per impostazione predefinita, tra cui CA1417. Se il progetto contiene codice che viola questa regola ed è configurato per considerare gli avvisi come errori, questa modifica potrebbe interrompere la compilazione.

La regola CA1417 contrassegna definizioni di metodo P/Invoke in cui un parametro String è contrassegnato con l'attributo OutAttribute e viene passato per valore. Ad esempio:

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

Il runtime .NET gestisce una tabella, denominata pool di stagisti, che contiene un singolo riferimento a ogni stringa letterale univoca in un programma. Se una stringa internata contrassegnata con OutAttribute viene passata per valore a un metodo P/Invoke, il runtime può essere destabilizzato. Per ulteriori informazioni sull'interno delle stringhe, consultare le osservazioni per String.Intern(String).

Versione introdotta

5.0

  • Se è necessario effettuare il marshalling dei dati stringa modificati al chiamante, passare invece la stringa per riferimento.

    [DllImport("MyLibrary")]
    private static extern void PIMethod(out string s);
    
  • Se non è necessario effettuare il marshalling dei dati delle stringhe modificate al chiamante, è sufficiente rimuovere OutAttribute.

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

    Per ulteriori informazioni, consultare CA1417.

  • Per disabilitare completamente l'analisi del codice, impostare EnableNETAnalyzers su false nel file di progetto. Per altre informazioni, vedere EnableNETAnalyzers.

API interessate

Non rilevabile tramite analisi dell'API.