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
Ação recomendada
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
comofalse
no arquivo de projeto. Para obter mais informações, confira EnableNETAnalyzers.
APIs afetadas
Não detectáveis com a análise de API.