CA1418: 플랫폼 호환성 유효성 검사

속성 값
규칙 ID CA1418
제목 플랫폼 호환성 유효성 검사
범주 상호 운용성
수정 사항이 호환성을 깨뜨리는지 여부 또는 무중단인지 여부 주요 변경 아님
.NET 10에서 기본적으로 사용하도록 설정 경고로서
적용 가능한 언어 C# 및 Visual Basic

원인

플랫폼 호환성 분석기에는 유효한 플랫폼 이름과 버전이 필요합니다. OSPlatformAttribute 생성자에 제공된 플랫폼 문자열이 알 수 없는 플랫폼 이름으로 구성되었거나 선택적 버전 부분이 잘못된 경우 위반이 보고됩니다.

규칙 설명

OSPlatformAttribute에서 파생된 플랫폼 호환성 특성은 선택적 버전 부분이 있는 OS(운영 체제) 플랫폼 이름에 문자열 리터럴을 사용합니다. 이 문자열은 알려진 플랫폼 이름과 버전 부분 없이 또는 유효한 버전 부분과 함께 구성되어야 합니다.

알려진 플랫폼 이름 목록은 다음 두 위치에서 채워집니다.

  • PlatformName의 OperatingSystem 가드 메서드에서 OperatingSystem.Is<PlatformName>[VersionAtLeast]()로 이름 붙여진 부분. 예를 들어 가드 메서드 OperatingSystem.IsWindows()는 알려진 플랫폼 이름 목록에 Windows를 추가합니다.

  • 프로젝트의 SupportedPlatform 항목으로 구성된 MSBuild 항목 그룹(기본 MSBuild SupportedPlatforms 목록 포함). 이는 알려진 플랫폼에 대한 프로젝트별 지식입니다. 클래스 라이브러리 작성자가 알려진 플랫폼 목록에 더 많은 플랫폼을 추가할 수 있습니다. 예시:

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

플랫폼 문자열에 ‘버전’ 부분이 포함된 경우 이 부분은 유효한 으로서 다음과 같은 Version 형식이어야 합니다.major.minor[.build[.revision]]

위반

  • Solaris는 기본 MSBuild SupportedPlatforms 목록에 포함되지 않고, 클래스에 OperatingSystem.IsSolaris()라는 가드 메서드가 없기 때문에 알 수 없는 플랫폼 이름입니다.

    [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()라는 가드 메서드도 있습니다. 그러나 System.OperatingSystem.IsLinuxVersionAtLeast(int,int) 플랫폼에 대해 Linux 같은 버전 지정 가드 메서드는 없으므로 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() { }
    
  • 잘못된 버전을 수정합니다. 예를 들어 Android의 경우 10은 유효한 버전이 아니지만 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() { }
    

경고를 표시하지 않는 경우

알 수 없는 플랫폼 이름이나 잘못된 버전을 사용하는 것은 권장되지 않으므로 이 규칙을 제외하지 않아야 합니다.

참고하기