OS 버전은 Windows 10 OS 릴리스에서 증가했습니다. 즉, Windows 10 내부 버전 번호도 10.0으로 변경되었습니다. 이전처럼 OS 버전 변경 후 애플리케이션 및 디바이스 호환성을 유지하기 위해 최선을 다하고 있습니다. 대부분의 앱 범주(커널 종속성 없음)의 경우 변경 내용이 앱 기능에 부정적인 영향을 주지 않으며 기존 앱은 Windows 10 계속 제대로 작동합니다.
발현
이 변경 내용의 징후는 앱과 관련이 있습니다. 즉, 구체적으로 OS 버전을 확인하는 앱이 더 높은 버전 번호를 받게 되어 다음과 같은 상황이 하나 이상 발생할 수 있습니다.
- 앱 설치 관리자가 앱을 설치할 수 없고 앱이 시작되지 않을 수 있습니다.
- 앱이 불안정하거나 충돌할 수 있습니다.
- 앱이 오류 메시지를 생성하지만 계속 제대로 작동할 수 있습니다.
일부 앱은 버전 확인을 수행하고 단순히 사용자에게 경고를 전달합니다. 그러나 버전 확인에 긴밀하게 바인딩된 앱이 있습니다(드라이버 또는 커널 모드에서 검색 방지). 이러한 경우 잘못된 버전이 발견되면 앱이 실패합니다. 버전 확인 대신 다음 접근 방식 중 하나를 사용하는 것이 좋습니다.
- 앱이 특정 API 기능에 종속된 경우 올바른 API 버전을 대상으로 지정합니다.
- NTDDI(NT 디바이스 드라이버 인터페이스) 버전 번호는 API의 대상 기능이 변경되는 경우에만 증가합니다. 기능 팀에서 만든 APISet 또는 기타 노출된 API를 통해 변경 내용을 감지하고 일부 기능 또는 수정을 위해 버전을 프록시로 사용하지 않도록 합니다. 주요 변경 내용이 있는데 적절한 확인이 표시되지 않는 경우 버그가 있는 것입니다.
- 앱이 레지스트리, 파일 버전, 오프셋, 커널 모드, 드라이버 또는 기타 수단을 통해 이상한 방법으로 버전을 확인하지 않는지 확인합니다. 앱이 버전을 반드시 확인해야 하는 경우 주, 부 및 빌드 번호를 반환해야 하는 GetVersion API를 사용합니다.
- GetVersion API 또는 VerifyVersionInfo와 같은 다른 버전 도우미 함수를 사용하는 경우 Windows 8.1 이후 이 API의 동작이 변경되었음을 기억하세요. 자세한 내용은 API 설명서를 참조하세요.
- 맬웨어 방지 또는 방화벽과 같은 앱을 소유하고 있는 경우 일반적인 피드백 채널과 Windows 참가자 프로그램을 통해 작업해야 합니다.
앱 매니페스트
다음은 예제 앱 매니페스트입니다.
<exe>.manifest
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity
type="win32"
name=SXS_ASSEMBLY_NAME
version=SXS_ASSEMBLY_VERSION
processorArchitecture=SXS_PROCESSOR_ARCHITECTURE
/>
<description> my app exe </description>
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel
level="asInvoker"
uiAccess="false"
/>
</requestedPrivileges>
</security>
</trustInfo>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
* <!-- Windows 10 -->
* <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
<!-- Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!-- Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!-- Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!-- Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
</application>
</compatibility>
</assembly>
다음 변수를 원본에 추가합니다.
- SXS_MANIFEST_RESOURCE_ID=1
- SXS_MANIFEST=foo.manifest
- SXS_ASSEMBLY_NAME=Microsoft.Windows.Foo
- SXS_ASSEMBLY_VERSION=1.0
- SXS_ASSEMBLY_LANGUAGE_INDEPENDENT=1
- SXS_MANIFEST_IN_RESOURCES=1
Windows 10 경우 위의 두 줄에 별표(*)가 표시되어 있으므로 애플리케이션을 OS의 Windows 10 버전으로 정확하게 대상으로 지정하는 방법을 보여 줍니다. 이전 버전의 Windows OS에서 실행할 때 Windows 10 대한 .exe 매니페스트하는 것은 아무런 영향을 미치지 않습니다. 이미 정의된 경우 .rc 파일에 이 파일을 추가할 수도 있습니다. trustInfo를 추가하는 것은 필수는 아니지만 매우 권장됩니다. 이렇게 하면 OS가 Windows 10 또는 Windows 8.1 관계없이 .exe 항상 올바른 버전을 가져올 수 있습니다.