Бөлісу құралы:


CA1418: проверка совместимости платформ

Свойство Значение
Идентификатор правила CA1418
Заголовок Проверка совместимости платформ
Категория Совместимость
Исправление является критическим или не критическим неразрывный
Включен по умолчанию в .NET 10 Как предупреждение
Применимые языки C# и Visual Basic

Причина

Анализатор совместимости платформ требует указать действительное имя и версию платформы. О нарушениях сообщается, если строка платформы, предоставленная конструктору OSPlatformAttribute, состоит из неизвестного имени платформы или необязательная часть версии является недопустимой.

Описание правила

Атрибуты совместимости платформы, производные от OSPlatformAttribute, используют строковые литералы для имен платформ операционной системы (ОС) с необязательной частью версии. Строка должна состоять из известного имени платформы без указания части версии или с указанием допустимой части.

Список известных имен платформ заполняется из двух источников:

  • Часть PlatformName методов охраны OperatingSystem с именем OperatingSystem.Is<PlatformName>[VersionAtLeast](). Например, метод-защита OperatingSystem.IsWindows() добавляет Windows в список известных имен платформ.

  • Группа элементов MSBuild проекта, включающая элементы SupportedPlatform и список MSBuild SupportedPlatforms по умолчанию. Это относящиеся к проекту знания об известных платформах. Это позволяет авторам библиотек классов добавлять дополнительные платформы в список известных платформ. Например:

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

Если строка платформы содержит версию, она должна быть допустимой Version в следующем формате: major.minor[.build[.revision]].

Нарушения

  • Solaris — это неизвестное имя платформы, поскольку оно не входит в список MSBuild SupportedPlatforms по умолчанию и не существует метода условия с именем OperatingSystem.IsSolaris() в классе OperatingSystem.

    [SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name.
    public void SolarisApi() { }
    
  • Android является известной платформой, так как существует защитный метод OperatingSystem.IsAndroid() типа OperatingSystem. Однако часть версии не является допустимой. Она должна содержать по крайней мере два целых числа, разделенных точкой.

    [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 — это известная платформа, поскольку она входит в список MSBuild SupportedPlatforms по умолчанию, и существует метод-защита с именем OperatingSystem.IsLinux(). Однако для платформы Linux не существуют версионные методы защиты, такие как System.OperatingSystem.IsLinuxVersionAtLeast(int,int), поэтому версия не поддерживается в Linux.

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

Устранение нарушений

  • Измените платформу на известное название платформы.

  • Если имя платформы указано правильно и вы хотите сделать его известной платформой, добавьте его в список MSBuild SupportedPlatforms в файле проекта:

      <ItemGroup>
        <SupportedPlatform Include="Solaris" />
      </ItemGroup>
    
    [SupportedOSPlatform("Solaris")] // No warning
    public void SolarisApi() { }
    
  • Исправьте недопустимую версию. Например, для Android10 не является допустимой версией, а 10.0 является.

    // 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() { }
    
  • Если платформа не поддерживает версию, удалите часть версии.

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

Когда лучше отключить предупреждения

Не рекомендуется использовать неизвестное имя платформы или недопустимую версию, поэтому не следует подавлять это правило.

См. также