CA1417: Do not use OutAttribute on string parameters for P/Invokes (No usar OutAttribute en parámetros de cadena para P/Invoke)

Propiedad Value
Identificador de la regla CA1417
Título No usar OutAttribute en parámetros de cadena para P/Invoke
Categoría Interoperabilidad
La corrección es problemática o no problemática Poco problemático
Habilitado de forma predeterminada en .NET 8 Como advertencia

Causa

Un parámetro de cadena P/Invoke se pasa como valor y se marca con OutAttribute.

Descripción de la regla

El entorno de ejecución de .NET realiza automáticamente el internamiento de cadenas. Si una cadena internalizada marcada con OutAttribute se pasa por valor a un P/Invoke, el entorno de ejecución se puede desestabilizar.

Cómo corregir infracciones

Si es necesario serializar los datos modificados de la cadena de vuelta al autor de la llamada, pase la cadena por referencia en su lugar. De lo contrario, OutAttribute se puede quitar sin realizar ningún otro cambio.

 // 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);

Cuándo suprimir las advertencias

No se puede suprimir una advertencia de esta regla.

Consulte también