CA1418: Verifiera plattformskompatibilitet

Property Värde
Regel-ID CA1418
Title Verifiera plattformskompatibilitet
Kategori Samverkan
Korrigeringen är icke-bakåtkompatibel Icke-icke-bryta
Aktiverad som standard i .NET 8 Som varning

Orsak

Plattformskompatibilitetsanalyseraren kräver ett giltigt plattformsnamn och en giltig version. Överträdelser rapporteras om plattformssträngen OSPlatformAttribute som tillhandahålls konstruktorn består av ett okänt plattformsnamn eller om den valfria versionsdelen är ogiltig.

Regelbeskrivning

Plattformskompatibilitetsattribut som härleds från OSPlatformAttribute använda strängliteraler för operativsystemplattformsnamn (OS) med en valfri versionsdel. Strängen ska bestå av ett känt plattformsnamn och antingen ingen versionsdel eller en giltig versionsdel.

Listan med kända plattformsnamn fylls i från två platser:

  • Den PlatformName del av OperatingSystem skyddsmetoderna som heter OperatingSystem.Is<PlatformName>[VersionAtLeast](). Till exempel lägger Windows guard-metoden OperatingSystem.IsWindows() till listan med kända plattformsnamn.

  • Projektets MSBuild-objektgrupp med SupportedPlatform objekt, inklusive standardlistan MSBuild SupportedPlatforms. Det här är projektspecifik kunskap om kända plattformar. Det gör att klassbiblioteksförfattare kan lägga till fler plattformar i listan över kända plattformar. Till exempel:

      <ItemGroup>
        <SupportedPlatform Include="PlatformName" />
      </ItemGroup>
    

Om plattformssträngen innehåller en versionsdel bör den vara giltig Version med följande format: major.minor[.build[.revision]].

Kränkningar

  • Solarisär ett okänt plattformsnamn eftersom det inte ingår i standardlistan MSBuild SupportedPlatforms och det inte finns någon skyddsmetod med namnet OperatingSystem.IsSolaris() i OperatingSystem klassen.

    [SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name.
    public void SolarisApi() { }
    
  • Android är en känd plattform eftersom det finns en OperatingSystem.IsAndroid() skyddsmetod i OperatingSystem typen . Versionsdelen är dock inte en giltig version. Det bör ha minst två heltal avgränsade med en punkt.

    [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är en känd plattform eftersom den ingår i standardlistan MSBuild SupportedPlatforms och det finns även en skyddsmetod med namnet OperatingSystem.IsLinux(). Det finns dock inga versionshanterade skyddsmetoder som System.OperatingSystem.IsLinuxVersionAtLeast(int,int) för Linux plattformen, därför stöds ingen versionsdel i Linux.

    [SupportedOSPlatform("Linux4.8")] // Warns: Version '4.8' is not valid for platform 'Linux'. Do not use versions for this platform.
    public void LinuxApi() { }
    

Så här åtgärdar du överträdelser

  • Ändra plattformen till ett känt plattformsnamn.

  • Om plattformsnamnet är korrekt och du vill göra det till en känd plattform lägger du till det i listan MSBuild SupportedPlatforms i projektfilen:

      <ItemGroup>
        <SupportedPlatform Include="Solaris" />
      </ItemGroup>
    
    [SupportedOSPlatform("Solaris")] // No warning
    public void SolarisApi() { }
    
  • Åtgärda den ogiltiga versionen. För , 10 är till exempel Androidinte en giltig version, men 10.0 är giltig.

    // 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() { }
    
  • Om plattformen inte stöder en version tar du bort versionsdelen.

    // 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() { }
    

När du ska ignorera varningar

Vi rekommenderar inte att du använder ett okänt plattformsnamn eller en ogiltig version, så du bör inte ignorera den här regeln.

Se även