Partilhar via


CA1418: Validar compatibilidade de plataforma

Propriedade valor
ID da regra CA1418
Título Validar a compatibilidade da plataforma
Categoria Interoperabilidade
A correção causa interrupção ou não Ininterrupto
Habilitado por padrão no .NET 10 Como aviso
Línguas aplicáveis C# e Visual Basic

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 de OSPlatformAttribute utilizam literais de cadeia de caracteres para os nomes das plataformas do sistema operacional (SO), com uma parte de versão opcional. A cadeia de caracteres deve ser composta por um nome de plataforma já conhecido e pode não ter parte de versão ou ter 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 de MSBuild SupportedPlatforms. Este é o conhecimento de plataformas conhecidas específico do projeto. 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 versão, deverá ser um Version válido 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 de guarda chamado OperatingSystem.IsSolaris() na classe OperatingSystem.

    [SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name.
    public void SolarisApi() { }
    
  • Android é uma plataforma conhecida porque existe 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 Linux, portanto, nenhuma parte da versão é suportada 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, 10 não é uma versão válida, 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