버전 적응 앱: 이전 버전과 호환성을 유지하면서 새로운 API 사용하기

Windows 10 SDK의 각 릴리스에서는 활용하고 싶어할 만한 멋진 기능이 새로 추가됩니다. 그러나 모든 고객이 동시에 최신 버전의 Windows 10으로 디바이스를 업데이트하지는 않을 것이므로 앱이 가능한 한 가장 광범위한 장치에서 작동하도록 해야 합니다. 여기서는 이전 버전의 Windows 10에서 실행되지만 최신 업데이트가 설치된 장치에서 앱이 실행될 때마다 새로운 기능도 활용하도록 앱을 설계하는 방법을 볼 수 있습니다.

앱이 가장 광범위한 Windows 10 장치를 지원하도록 하려면 세 단계를 수행해야 합니다.

  • 첫째, 최신 API를 대상으로 하도록 Visual Studio 프로젝트를 구성합니다. 이렇게 하면 앱을 컴파일할 때 발생하는 상황에 영향을 주게 됩니다.
  • 둘째, 런타임 검사를 수행하여 앱이 실행되고 있는 장치에 있는 API만 호출하도록 합니다.
  • 셋째, Windows 10의 최소 버전과 대상 버전에서 앱을 테스트합니다.

Visual Studio 프로젝트 구성하기

여러 Windows 10 버전을 지원하기 위한 첫 번째 단계는 Visual Studio 프로젝트에서 대상최소 지원 OS/SDK 버전을 지정하는 것입니다.

  • 대상: Visual Studio에서 앱 코드를 컴파일하고 모든 도구를 실행하는 SDK 버전입니다. 이 SDK 버전의 모든 API 및 리소스는 컴파일 시에 앱 코드에서 사용할 수 있습니다.
  • 최소: 앱이 실행될 수 있는 가장 이전 OS 버전을 지원하는(그리고 Microsoft Store에서 배포될) SDK 버전과 Visual Studio에서 앱 태그 코드를 컴파일하는 버전입니다.

런타임 중에 앱은 배포된 OS 버전에 대해 실행되므로 해당 버전에서 사용할 수 없는 리소스를 사용하거나 API를 호출하는 경우 앱에서 예외가 발생합니다. 런타임 검사를 사용하여 올바른 API를 호출하는 방법은 이 문서의 뒷부분에서 볼 수 있습니다.

대상 및 최소 설정은 OS/SDK 버전 범위의 끝을 지정합니다. 그러나 최소 버전에서 앱을 테스트하는 경우 최소 및 대상 간의 모든 버전에서 앱이 실행될 것을 확인할 수 있습니다.

Visual Studio는 API 호환성에 대해 경고하지 않습니다. 최소 및 대상을 포함하여 그 사이에 속하는 모든 OS 버전에서 앱이 예상대로 수행되는지 테스트하고 확인하는 것은 사용자의 책임입니다.

Visual Studio 2015, 업데이트 2 이상에서 새 프로젝트를 만들 때 앱이 지원하는 대상 및 최소 버전을 설정하라는 메시지가 표시됩니다. 기본적으로 대상 버전은 설치된 최상위 SDK 버전이고, 최소 버전은 설치된 최하위 SDK 버전입니다. 컴퓨터에 설치된 SDK 버전에서만 대상 및 최소를 선택할 수 있습니다.

Set the target SDK in Visual Studio

일반적으로 기본값을 그대로 유지하는 것이 좋습니다. 그러나 SDK의 Preview 버전이 설치되어 있고 프로덕션 코드를 작성하는 경우 대상 버전을 Preview SDK에서 최신 공식 SDK 버전으로 변경해야 합니다.

Visual Studio에서 이미 만들어진 프로젝트에 대한 최소 및 대상 버전을 변경하려면 프로젝트 -> 속성 -> 애플리케이션 탭 -> 대상 지정으로 이동합니다.

Change the target SDK in Visual Studio

다음 테이블은 참조를 위해 각 SDK에 대한 빌드 번호를 보여 줍니다.

식별 이름 버전 OS/SDK 빌드
RTM 1507 10240
11월 업데이트 1511 10586
1주년 업데이트 1607 14393
크리에이터 업데이트 1703 15063
Fall Creators Update 1709 16299
2018년 4월 업데이트 1803 17134
2018년 10월 업데이트 1809 17763
2019년 5월 업데이트 1903 18362

출시된 모든 버전의 SDK는 Windows SDK 및 Emulator 아카이브에서 다운로드할 수 있습니다. 최신 Windows Insider Preview SDK는 Windows 참가자 사이트의 개발자 섹션에서 다운로드할 수 있습니다.

Windows 10 업데이트에 대한 자세한 정보는 Windows 10 릴리스 정보를 참조하세요. Windows 10 지원 수명 주기에 대한 중요한 정보는 Windows 수명 주기 팩트 시트를 참조하세요.

API 검사 수행하기

버전 적응 앱의 핵심은 API 계약과 ApiInformation 클래스의 조합입니다. 이 클래스를 사용하여 지정된 API 계약, 유형 또는 구성원이 있는지 감지할 수 있으므로, 다양한 장치와 OS 버전 사이에서 안전하게 API를 호출할 수 있습니다.

API 계약

장치 패밀리 내의 API 세트는 API 계약이라는 하위 분류로 나누어져 있습니다. ApiInformation.IsApiContractPresent 메서드를 사용하여 API 계약의 존재 여부를 테스트할 수 있습니다. 모두 같은 버전의 API 계약에 있는 많은 API의 현재 상태를 테스트하려는 경우에 유용합니다.

    bool isScannerDeviceContract_1_Present =
        Windows.Foundation.Metadata.ApiInformation.IsApiContractPresent
            ("Windows.Devices.Scanners.ScannerDeviceContract", 1);

API 계약이란? 기본적으로 API 계약은 일종의 기능으로, 특정한 기능을 함께 제공하는 관련된 API 세트입니다. 가상 API 계약은 클래스 2개, 인터페이스 5개, 구조 1개, 열거형 2개 등이 포함된 API 세트를 나타낼 수 있습니다.

논리적으로 관련된 유형은 API 계약으로 그룹화되며, Windows 10부터 모든 Windows 런타임 API는 일부 API 계약의 멤버입니다. API 계약을 사용하여 장치에서 특정 기능 또는 API를 사용할 수 있는지 확인하여 특정 장치나 OS 대신에 장치 기능을 효과적으로 확인할 수 있습니다. API 계약의 API 중 하나를 구현하려면 API 계약의 모든 API를 구현하는 플랫폼이 필요합니다. 즉, 실행 중인 OS가 특정 API 계약을 지원하는지 테스트할 수 있으며, 지원한다면 각 API를 확인하지 않고 API 계약의 모든 API를 호출할 수 있습니다.

가장 크고 자주 사용되는 API 계약은 Windows.Foundation.UniversalApiContract입니다. 여기에는 Universal Windows Platform의 API가 대부분 포함되어 있습니다. 사용할 수 있는 다양한 API 계약은 장치 패밀리 확장 SDK 및 API 계약 문서에서 확인할 수 있습니다. 대부분의 API 계약은 기능적으로 관련된 API 세트입니다.

참고

아직 설명서가 없는 미리 보기 버전의 Windows SDK(소프트웨어 개발 키트)가 설치되어 있다면, SDK 설치 폴더인 ‘(Program Files (x86))\Windows Kits\10\Platforms<platform><SDK version>\Platform.xml’에 있는 ‘Platform.xml’ 파일에서도 API 계약 지원 정보를 확인할 수 있습니다.

버전 적응 코드 및 조건부 XAML

모든 버전의 Windows 10에서 ApiInformation 클래스를 사용하여 호출할 API의 존재 여부를 테스트할 수 있습니다. 적응 코드에서는 세부적으로 필요한 API를 테스트하기 위해 IsTypePresent, IsEventPresent, IsMethodPresent IsPropertyPresent와 같은 다양한 클래스의 메서드를 사용할 수 있습니다.

자세한 정보와 예시는 버전 적응 코드를 참조하세요.

앱 최소 버전이 빌드 15063(크리에이터 업데이트) 이상일 경우, 코드 숨김 파일을 사용하지 않고 조건부 XAML을 사용하여 태그에서 속성을 설정하고 개체를 인스턴스화할 수 있습니다. 조건부 XAML은 태그에서 ApiInformation.IsApiContractPresent 메서드를 사용하는 방법을 제공합니다.

자세한 내용과 예시는 조건부 XAML을 참조하세요.

지연 로드된 API

QueryOptionalDelayLoadedAPI 함수를 사용하면 Store 앱(정책에서 LoadLibrary 호출을 허용하지 않음)에서 지연 로드된 함수가 실제로 발견되었는지 여부를 검색할 수 있습니다.

#include <windows.h>
#include <commdlg.h>
#include <libloaderapi2.h>
#include <stdio.h>

EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HMODULE_THISCOMPONENT reinterpret_cast<HMODULE>(&__ImageBase)

int __cdecl main(int argc, char** argv)
{
    if (QueryOptionalDelayLoadedAPI(HMODULE_THISCOMPONENT,
          "comdlg32.dll", "GetOpenFileNameW", 0))
    {
        printf("GetOpenFileNameW can be called!\n");
    }
    return 0;
}

버전 적응 앱 테스트하기

버전 적응 코드나 조건부 XAML을 사용하여 버전 적응 앱을 제작할 경우, Windows 10의 최소 버전을 실행하는 장치와 대상 버전을 실행하는 장치에서 테스트해야 합니다.

모든 조건부 코드 경로를 한 장치에서 테스트할 수는 없습니다. 모든 코드 경로를 테스트하려면 지원되는 최소 OS 버전을 실행하는 원격 장치(또는 가상 머신)에 앱을 배포하고 테스트해야 합니다. 원격 디버깅에 대한 자세한 정보는 UWP 앱 배포 및 디버깅하기를 참조하세요.