Partilhar via


CA1417: Não use OutAttribute em parâmetros de cadeia de caracteres para P/Invokes

Property valor
ID da regra CA1417
Título Não use OutAttribute parâmetros de cadeia de caracteres para P/Invokes
Categoria Interoperabilidade
A correção está quebrando ou não quebrando Sem quebra
Habilitado por padrão no .NET 9 Como aviso

Motivo

Um parâmetro de cadeia de caracteres P/Invoke é passado por valor e marcado com OutAttribute.

Descrição da regra

O tempo de execução do .NET executa automaticamente o interning de cadeia de caracteres. Se uma cadeia de caracteres interned marcada com OutAttribute for passada por valor para um P/Invoke, o tempo de execução pode ser desestabilizado.

Como corrigir violações

Se for necessário empacotar os dados de cadeia de caracteres modificados de volta para o chamador, passe a cadeia de caracteres por referência. Caso contrário, o OutAttribute pode ser removido sem quaisquer outras alterações.

 // Violation
[DllImport("MyLibrary")]
private static extern void Foo([Out] string s);

// Fixed: passed by reference
[DllImport("MyLibrary")]
private static extern void Foo(out string s);

// Fixed: marshalling data back to caller is not required
[DllImport("MyLibrary")]
private static extern void Foo(string s);

Quando suprimir avisos

Não é seguro suprimir uma advertência desta regra.

Consulte também