CA1418 : Valider la compatibilité des plateformes

Propriété Value
Identificateur de la règle CA1418
Titre Valider la compatibilité de la plateforme
Catégorie Interopérabilité
Le correctif est cassant ou non cassant Sans rupture
Activé par défaut dans .NET 8 Comme avertissement

Cause

Un nom et une version de plateforme valides sont nécessaires pour l’analyseur de compatibilité des plateformes. Des violations sont signalées si la chaîne de plateforme fournie au constructeur OSPlatformAttribute se compose d’un nom de plateforme inconnu ou si la partie de version facultative n’est pas valide.

Description de la règle

Les attributs de compatibilité des plateformes dérivés de OSPlatformAttribute utilisent comme noms de plateforme de système d’exploitation des littéraux de chaîne comportant une partie version facultative. La chaîne doit se composer d’un nom de plateforme connu et d’une partie version valide (ou d’aucune partie version).

La liste des noms de plateforme connus est remplie à partir de deux emplacements :

  • Partie PlatformName des méthodes de protection OperatingSystem nommée OperatingSystem.Is<PlatformName>[VersionAtLeast](). Par exemple, la méthode de protection OperatingSystem.IsWindows() ajoute Windows à la liste des noms de plateforme connus.

  • Le groupe d’éléments MSBuild SupportedPlatform du projet, y compris la liste MSBuild SupportedPlatforms par défaut. Il s’agit des plateformes connues dans le cadre du projet. Les auteurs de bibliothèques de classes peuvent ainsi ajouter d’autres plateformes à cette liste. Par exemple :

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

Si la chaîne de plateforme contient une partie version, celle-ci doit constituer une Version valide au format major.minor[.build[.revision]].

Violations

  • Solaris est un nom de plateforme inconnu, car il n’est pas inclus dans la liste MSBuild SupportedPlatforms par défaut, et il n’existe aucune méthode de protection nommée OperatingSystem.IsSolaris() dans la classe OperatingSystem.

    [SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name.
    public void SolarisApi() { }
    
  • Android est une plateforme connue, car il existe une méthode de protection OperatingSystem.IsAndroid() dans le type OperatingSystem. Toutefois, la partie version ne constitue pas une version valide. Elle doit comporter au moins deux entiers séparés par un point.

    [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 est une plateforme connue, car elle est incluse dans la liste MSBuild SupportedPlatforms par défaut, et il existe également une méthode de protection nommée OperatingSystem.IsLinux(). Toutefois, il n’existe aucune méthode de protection avec version telle que System.OperatingSystem.IsLinuxVersionAtLeast(int,int) pour la plateforme Linux. Par conséquent, aucune partie version n’est prise en charge sur Linux.

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

Comment corriger les violations

  • Choisissez un nom de plateforme connu.

  • Si le nom de la plateforme est correct et que vous souhaitez en faire une plateforme connue, ajoutez-le à la liste MSBuild SupportedPlatforms dans votre fichier projet :

      <ItemGroup>
        <SupportedPlatform Include="Solaris" />
      </ItemGroup>
    
    [SupportedOSPlatform("Solaris")] // No warning
    public void SolarisApi() { }
    
  • Corrigez la version non valide. Par exemple, 10 ne constitue pas une version valide pour Android, tandis que 10.0 est valide.

    // 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() { }
    
  • Si la plateforme ne prend pas en charge la version, supprimez la partie version.

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

Quand supprimer les avertissements

Dans la mesure où il n’est pas recommandé d’utiliser un nom de plateforme inconnu ni une version non valide, ne supprimez pas cette règle.

Voir aussi