CA1418: Validar compatibilidade de plataforma
Property | valor |
---|---|
ID da regra | CA1418 |
Título | Validar a compatibilidade da plataforma |
Categoria | Interoperabilidade |
A correção está quebrando ou não quebrando | Sem quebra |
Habilitado por padrão no .NET 8 | Como aviso |
Motivo
O analisador de compatibilidade de plataforma requer um nome e uma versão válidos da plataforma. As violações são relatadas se a cadeia de caracteres da plataforma fornecida ao OSPlatformAttribute construtor consistir em um nome de plataforma desconhecido ou se a parte da versão opcional for inválida.
Descrição da regra
Os atributos de compatibilidade de plataforma derivados do uso de literais de cadeia de caracteres para nomes de plataforma do sistema operacional (SO) com uma parte de OSPlatformAttribute versão opcional. A cadeia de caracteres deve consistir em um nome de plataforma conhecido e nenhuma parte de versão ou uma parte de versão válida.
A lista de nomes de plataforma conhecidos é preenchida a partir de dois locais:
A
PlatformName
parte dos métodos de OperatingSystem guarda chamadaOperatingSystem.Is<PlatformName>[VersionAtLeast]()
. Por exemplo, o método OperatingSystem.IsWindows() guard adicionaWindows
à lista de nomes de plataforma conhecidos.O grupo de itens MSBuild do
SupportedPlatform
projeto, incluindo a lista padrão MSBuild SupportedPlatforms. Este é o conhecimento específico do projeto de plataformas conhecidas. Ele permite que os autores da biblioteca de classes adicionem mais plataformas à lista de plataformas conhecidas. Por exemplo:<ItemGroup> <SupportedPlatform Include="PlatformName" /> </ItemGroup>
Se a cadeia de caracteres da plataforma contiver uma parte da versão , ela deverá ser válida Version com o seguinte formato: major.minor[.build[.revision]]
.
Violações
Solaris
é um nome de plataforma desconhecido porque não está incluído na lista padrão MSBuild SupportedPlatforms e não há nenhum método guard nomeadoOperatingSystem.IsSolaris()
na OperatingSystem classe.[SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name. public void SolarisApi() { }
Android
é uma plataforma conhecida porque há um OperatingSystem.IsAndroid() método de guarda no OperatingSystem tipo. No entanto, a parte da versão não é uma versão válida. Deve ter pelo menos dois inteiros separados por um ponto.[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
é uma plataforma conhecida porque está incluída na lista padrão MSBuild SupportedPlatforms e também há um método de guarda chamado OperatingSystem.IsLinux(). No entanto, não existem métodos de proteção versionada comoSystem.OperatingSystem.IsLinuxVersionAtLeast(int,int)
para a plataforma, portanto, nenhuma parte da versão é suportadaLinux
no Linux.[SupportedOSPlatform("Linux4.8")] // Warns: Version '4.8' is not valid for platform 'Linux'. Do not use versions for this platform. public void LinuxApi() { }
Como corrigir violações
Altere a plataforma para um nome de plataforma conhecido.
Se o nome da plataforma estiver correto e você quiser torná-la uma plataforma conhecida, adicione-a à lista MSBuild SupportedPlatforms no arquivo de projeto:
<ItemGroup> <SupportedPlatform Include="Solaris" /> </ItemGroup>
[SupportedOSPlatform("Solaris")] // No warning public void SolarisApi() { }
Corrija a versão inválida. Por exemplo, para
Android
, não é uma versão válida,10
mas10.0
é 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() { }
Se a plataforma não suportar uma versão, remova a parte da versão.
// 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() { }
Quando suprimir avisos
O uso de um nome de plataforma desconhecido ou de uma versão inválida não é recomendado, portanto, você não deve suprimir essa regra.