다음을 통해 공유


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

속성
규칙 ID CA1418
타이틀 플랫폼 호환성 유효성 검사
범주 상호 운용성
수정 사항이 주요 변경인지 여부 주요 변경 아님
.NET 8에서 기본적으로 사용 경고로

원인

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

규칙 설명

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

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

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

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

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

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

위반

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

    [SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name.
    public void SolarisApi() { }
    
  • AndroidOperatingSystem 형식에 OperatingSystem.IsAndroid() 가드 메서드가 있기 때문에 알려진 플랫폼입니다. 그러나 버전 부분은 유효한 버전이 아닙니다. 두 개 이상의 정수는 점으로 구분되어야 합니다.

    [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() { }
    
  • 잘못된 버전을 수정합니다. 예를 들어 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() { }
    

경고를 표시하지 않는 경우

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

참고 항목