| 속성 | 값 |
|---|---|
| 규칙 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 클래스에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() { }
경고를 표시하지 않는 경우
알 수 없는 플랫폼 이름이나 잘못된 버전을 사용하는 것은 권장되지 않으므로 이 규칙을 제외하지 않아야 합니다.
참고하기
.NET