CA1418: Weryfikowanie zgodności platformy

Właściwości Wartość
Identyfikator reguły CA1418
Tytuł Weryfikowanie zgodności platformy
Kategoria Współdziałanie
Poprawka powodująca niezgodność lub niezgodność Niezgodność
Domyślnie włączone na platformie .NET 8 Jako ostrzeżenie

Przyczyna

Analizator zgodności platformy wymaga prawidłowej nazwy i wersji platformy. Naruszenia są zgłaszane, jeśli ciąg platformy dostarczony do OSPlatformAttribute konstruktora składa się z nieznanej nazwy platformy lub jeśli opcjonalna część wersji jest nieprawidłowa.

Opis reguły

Atrybuty zgodności platformy pochodzące z OSPlatformAttribute literałów ciągu dla nazw platformy systemu operacyjnego z opcjonalną częścią wersji. Ciąg powinien składać się ze znanej nazwy platformy i nie zawiera części wersji lub prawidłowej części wersji.

Lista znanych nazw platform jest wypełniana z dwóch miejsc:

  • Część PlatformNameOperatingSystem metod ochrony o nazwie OperatingSystem.Is<PlatformName>[VersionAtLeast](). Na przykład metoda OperatingSystem.IsWindows() guard dodaje Windows do listy znanych nazw platform.

  • Grupa SupportedPlatform elementów MSBuild projektu obejmująca domyślną listę MSBuild SupportedPlatforms. Jest to specyficzna wiedza na temat znanych platform. Umożliwia autorom bibliotek klas dodawanie kolejnych platform do listy znanych platform. Na przykład:

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

Jeśli ciąg platformy zawiera część wersji , powinien być prawidłowy Version w następującym formacie: major.minor[.build[.revision]].

Naruszenia regulaminu

  • Solarisjest nieznanąnazwą platformy, ponieważ nie jest ona uwzględniona na domyślnej liście MSBuild SupportedPlatforms i nie ma metody ochrony o nazwie OperatingSystem.IsSolaris() w OperatingSystem klasie .

    [SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name.
    public void SolarisApi() { }
    
  • Androidjest znaną platformą OperatingSystem.IsAndroid(), ponieważ w typie OperatingSystem istnieje metoda ochrony. Jednak część wersji nie jest prawidłową wersją. Powinna zawierać co najmniej dwie liczby całkowite oddzielone kropką.

    [UnsupportedOSPlatform("Android10")] // Warns: Version '10' is not valid for platform 'Android'. Use a version with 2-4 parts for this platform.
    public void DoesNotWorkOnAndroid() { }
    
  • Linuxjest znaną platformą, ponieważ jest ona zawarta na domyślnej liście MSBuild SupportedPlatforms i istnieje również metoda ochrony o nazwie OperatingSystem.IsLinux(). Nie ma jednak żadnych metod ochrony w wersji, takich jak System.OperatingSystem.IsLinuxVersionAtLeast(int,int) dla Linux platformy, dlatego żadna część wersji nie jest obsługiwana w systemie Linux.

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

Jak naprawić naruszenia

  • Zmień platformę na znaną nazwę platformy.

  • Jeśli nazwa platformy jest poprawna i chcesz, aby była znana platforma, dodaj ją do listy MSBuild SupportedPlatforms w pliku projektu:

      <ItemGroup>
        <SupportedPlatform Include="Solaris" />
      </ItemGroup>
    
    [SupportedOSPlatform("Solaris")] // No warning
    public void SolarisApi() { }
    
  • Napraw nieprawidłową wersję. Na przykład dla parametru Android10 nie jest prawidłową wersją, ale 10.0 jest prawidłowa.

    // 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() { }
    
  • Jeśli platforma nie obsługuje wersji, usuń część wersji.

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

Kiedy pomijać ostrzeżenia

Nie zaleca się używania nieznanej nazwy platformy lub nieprawidłowej wersji, dlatego nie należy pomijać tej reguły.

Zobacz też