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

Property Valor
ID da regra CA1417
Título Não usar OutAttribute em parâmetros de cadeia de caracteres para P/Invokes
Categoria Interoperabilidade
Correção interruptiva ou sem interrupção Sem interrupção
Habilitado por padrão no .NET 8 Como aviso

Causa

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

Descrição da regra

O runtime do .NET executa automaticamente a centralização de cadeia de caracteres. Se uma cadeia de caracteres centralizada marcada com OutAttribute for transmitida por valor para um P/Invoke, o runtime poderá ser desestabilizado.

Como corrigir violações

Se o marshaling de dados de cadeia de caracteres modificados de volta para o chamador for necessário, transmita a cadeia de caracteres por referência. Caso contrário, o OutAttribute poderá ser removido sem 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 um aviso dessa regra.

Confira também