다음을 통해 공유


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

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

원인

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

규칙 설명

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

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

  • PlatformNameOperatingSystem 가드 메서드에서 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 클래스에 OperatingSystem.IsSolaris()라는 가드 메서드가 없기 때문에 알 수 없는 플랫폼 이름입니다.

    [SupportedOSPlatform("Solaris")] // Warns: The platform 'Solaris' is not a known platform name.
    public void SolarisApi() { }
    
  • AndroidOperatingSystem.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() { }
    

경고를 표시하지 않는 경우

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

참고하기