Advertencia CA1417: OutAttribute en parámetros de cadena para P/Invoke
La regla CA1417 del analizador de código de .NET está habilitada de forma predeterminada a partir de .NET 5. Genera una advertencia de compilación para cualquier definición del método de invocación de plataforma (P/Invoke) donde se pasa un parámetro String por valor y se marca con OutAttribute.
Descripción del cambio
A partir de .NET 5, el SDK de .NET incluye analizadores de código fuente de .NET. Varias de estas reglas están habilitadas de forma predeterminada, incluida la regla CA1417. Si el proyecto contiene código que infringe esta regla y está configurado para tratar las advertencias como errores, este cambio podría interrumpir la compilación.
La regla CA1417 marca las definiciones del método P/Invoke en las que un parámetro String está marcado con el atributo OutAttribute y se pasa por valor. Por ejemplo:
[DllImport("MyLibrary")]
private static extern void PIMethod([Out] string s);
El entorno de ejecución de .NET mantiene una tabla, denominada grupo de internos, que contiene una sola referencia a cada cadena literal única en un programa. Si una cadena internalizada marcada con OutAttribute se pasa por valor a un método P/Invoke, el entorno de ejecución se puede desestabilizar. Para obtener más información sobre la asignación al grupo interno de cadenas, vea los comentarios sobre String.Intern(String).
Versión introducida
5.0
Acción recomendada
Si necesita serializar los datos modificados de la cadena de vuelta al autor de la llamada, pase la cadena por referencia en su lugar.
[DllImport("MyLibrary")] private static extern void PIMethod(out string s);
Si no necesita serializar los datos modificados de la cadena de vuelta al autor de la llamada, simplemente quite el elemento OutAttribute.
[DllImport("MyLibrary")] private static extern void PIMethod(string s);
Para obtener más información, vea CA1417.
Para deshabilitar completamente el análisis de código, establezca
EnableNETAnalyzers
enfalse
en el archivo del proyecto. Para obtener más información, vea EnableNETAnalyzers.
API afectadas
No detectable a través del análisis de la API.