Share via


Aviso: CA1417: OutAttribute no parâmetro de cadeia de caracteres para P/Invoke

A regra CA1417 do analisador de código do .NET está habilitada por padrão do .NET 5 em diante. Ela gera um aviso de build para definições de método P/Invoke (invocação de plataforma) em que um parâmetro String é passado por valor e marcado com OutAttribute.

Descrição das alterações

Do .NET 5 em diante, o SDK do .NET inclui Analisadores de código-fonte do .NET. Várias dessas regras estão habilitadas, por padrão, inclusive a CA1417. Se o projeto contiver um código que viole essa regra e estiver configurado para tratar avisos como erros, essa alteração poderá interromper o build.

A regra CA1417 sinaliza definições de método P/Invoke em que um parâmetro String é marcado com o atributo OutAttribute e é passado por valor. Por exemplo:

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

O runtime do .NET mantém uma tabela, chamada de pool interno, que contém uma só referência a cada cadeia de caracteres literal exclusiva em um programa. Se uma cadeia de caracteres interna marcada com OutAttribute for passada por valor a um método P/Invoke, o runtime poderá ser desestabilizado. Para obter mais informações sobre cadeia de caracteres internas, confira as observações de String.Intern(String).

Versão introduzida

5,0

  • Se você precisar realizar marshal de dados de cadeia de caracteres modificados de volta ao chamador, passe a cadeia de caracteres por referência.

    [DllImport("MyLibrary")]
    private static extern void PIMethod(out string s);
    
  • Se você não precisar realizar marshal dos dados de cadeia de caracteres modificados de volta para o chamador, remova o OutAttribute.

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

    Para obter mais informações, confira CA1417.

  • Para desabilitar completamente a análise de código, defina EnableNETAnalyzers como false no arquivo de projeto. Para obter mais informações, confira EnableNETAnalyzers.

APIs afetadas

Não detectáveis com a análise de API.