CA1418: 플랫폼 호환성 유효성 검사
속성 | 값 |
---|---|
규칙 ID | CA1418 |
제목 | 플랫폼 호환성 유효성 검사 |
범주 | 상호 운용성 |
수정 사항이 주요 변경인지 여부 | 주요 변경 아님 |
.NET 9에서 기본적으로 사용 | 경고로 |
원인
플랫폼 호환성 분석기에는 유효한 플랫폼 이름과 버전이 필요합니다. 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() { }
Android
는 OperatingSystem 형식에 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() { }
경고를 표시하지 않는 경우
알 수 없는 플랫폼 이름 또는 잘못된 버전을 사용하는 것은 권장되지 않으므로 이 규칙을 표시하지 않아야 합니다.
참고 항목
.NET