CA1418: Validación de la compatibilidad con las plataformas
Propiedad | Value |
---|---|
Identificador de la regla | CA1418 |
Título | Validación de la compatibilidad con las plataformas |
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
El analizador de compatibilidad de plataformas requiere un nombre y una versión de plataforma válidos. Se notifican infracciones si la cadena de plataforma proporcionada al constructor OSPlatformAttribute consta de un nombre de plataforma desconocido o si el elemento de versión opcional no es válido.
Descripción de la regla
Los atributos de compatibilidad de plataforma derivados de OSPlatformAttribute usan literales de cadena para los nombres de plataforma del sistema operativo (SO) con un elemento de versión opcional. La cadena debe constar de un nombre de plataforma conocido y ningún elemento de versión o un elemento de versión válido.
La lista de nombres de plataforma conocidos se rellena desde dos lugares:
El elemento
PlatformName
de los métodos de restricción OperatingSystem denominadosOperatingSystem.Is<PlatformName>[VersionAtLeast]()
. Por ejemplo, el método de restricción OperatingSystem.IsWindows() agregaWindows
a la lista de nombres de plataforma conocidos.El grupo de elementos MSBuild del proyecto de
SupportedPlatform
elementos, incluida la lista MSBuild SupportedPlatforms predeterminada. Este es el conocimiento específico del proyecto de las plataformas conocidas. Permite a los autores de bibliotecas de clases agregar más plataformas a la lista de plataformas conocidas. Por ejemplo:<ItemGroup> <SupportedPlatform Include="PlatformName" /> </ItemGroup>
Si la cadena de plataforma contiene un elemento de versión, debe ser un elemento Version válido con el formato siguiente: major.minor[.build[.revision]]
.
Infracciones
Solaris
es un nombre de plataforma desconocido porque no se incluye en la lista MSBuild SupportedPlatforms predeterminada y no hay ningún método de restricción denominadoOperatingSystem.IsSolaris()
en la clase OperatingSystem.[SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name. public void SolarisApi() { }
Android
es una plataforma conocida porque hay un método de restricción OperatingSystem.IsAndroid() en el tipo OperatingSystem. Sin embargo, el elemento de versión no es una versión válida. Debe tener al menos dos enteros separados por un punto.[UnsupportedOSPlatform("Android10")] // Warns: Version '10' is not valid for platform 'Android'. Use a version with 2-4 parts for this platform. public void DoesNotWorkOnAndroid() { }
Linux
es una plataforma conocida porque se incluye en la lista MSBuild SupportedPlatforms predeterminada y, además, hay un método de restricción denominado OperatingSystem.IsLinux(). Sin embargo, no hay ningún método de restricción con versiones comoSystem.OperatingSystem.IsLinuxVersionAtLeast(int,int)
para la plataformaLinux
, por lo que no se admite ningún elemento de versión en Linux.[SupportedOSPlatform("Linux4.8")] // Warns: Version '4.8' is not valid for platform 'Linux'. Do not use versions for this platform. public void LinuxApi() { }
Cómo corregir infracciones
Cambie la plataforma a un nombre de plataforma conocido.
Si el nombre de plataforma es correcto y quiere convertirlo en una plataforma conocida, agréguelo a la lista MSBuild SupportedPlatforms del archivo del proyecto:
<ItemGroup> <SupportedPlatform Include="Solaris" /> </ItemGroup>
[SupportedOSPlatform("Solaris")] // No warning public void SolarisApi() { }
Corrija la versión no válida. Por ejemplo, para
Android
,10
no es una versión válida, pero10.0
es válida.// Before [UnsupportedOSPlatform("Android10")] // Warns: Version '10' is not valid for platform 'Android'. Use a version with 2-4 parts for this platform. public void DoesNotWorkOnAndroid() { } // After [UnsupportedOSPlatform("Android10.0")] // No warning. public void DoesNotWorkOnAndroid() { }
Si la plataforma no admite una versión, quite el elemento de versión.
// Before [SupportedOSPlatform("Linux4.8")] // Warns: Version '4.8' is not valid for platform 'Linux'. Do not use versions for this platform. public void LinuxApi() { } // After [SupportedOSPlatform("Linux")] // No warning. public void LinuxApi() { }
Cuándo suprimir las advertencias
No se recomienda usar un nombre de plataforma desconocido o una versión no válida, por lo que no debe suprimir esta regla.