Share via


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 chamada OperatingSystem.Is<PlatformName>[VersionAtLeast](). Por exemplo, o método OperatingSystem.IsWindows() guard adiciona Windows à 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 nomeado OperatingSystem.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 como System.OperatingSystem.IsLinuxVersionAtLeast(int,int) para a plataforma, portanto, nenhuma parte da versão é suportada Linux 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 mas 10.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.

Consulte também