C++/WinRT는 헤더 파일 기반 라이브러리로 구현되고 최신 Windows API에 대한 최고 수준의 액세스를 제공하도록 설계된 WinRT(Windows 런타임) API에 대한 완전히 표준 최신 C++17 언어 프로젝션입니다. C++/WinRT를 사용하면 표준 규격 C++17 컴파일러를 사용하여 Windows 런타임 API를 작성하고 사용할 수 있습니다. Windows SDK에는 C++/WinRT가 포함됩니다. 버전 10.0.17134.0(Windows 10, 버전 1803)에서 도입되었습니다.
C++/WinRT는 Microsoft가 권장하는 C++/CX 언어 프로젝션과 Windows 런타임 C++ 템플릿 라이브러리(WRL)의 대체입니다. C++/WinRT 대한
중요합니다
C++/WinRT의 가장 중요한 부분 중 일부는 C++/WinRT 대한 SDK 지원 및 C++/WinRT, XAML, VSIX 확장 및 NuGet 패키지대한
다음도 참조하세요: C++/WinRT 샘플 앱을 어디에서 찾을 수 있나요?.
언어 프로젝션
Windows 런타임은 COM(구성 요소 개체 모델) API를 기반으로 하며 언어 프로젝션통해 액세스하도록 설계되었습니다. 프로젝션은 COM 세부 정보를 숨기고 지정된 언어에 대한 보다 자연스러운 프로그래밍 환경을 제공합니다.
Windows 런타임 API 참조 콘텐츠의 C++/WinRT 언어 프로젝션
Windows 런타임 API
C++/WinRT, XAML, VSIX 확장 및 NuGet 패키지에 대한 Visual Studio 지원
Visual Studio 지원의 경우 Visual Studio 2022 또는 Visual Studio 2019 또는 Visual Studio 2017(버전 15.6 이상, 15.7 이상 권장)이 필요합니다. Visual Studio 설치 관리자 내에서 유니버설 Windows 플랫폼 개발 워크로드를 설치합니다. 유니버설 Windows 플랫폼 개발의
최신 버전의 Visual Studio 및 Windows SDK를 사용하여 개발하는 것이 좋습니다. 10.0.17763.0(Windows 10 버전 1809) 이전에 Windows SDK와 함께 제공된 C++/WinRT 버전을 사용하는 경우 위에서 언급한 Windows 네임스페이스 헤더를 사용하려면 10.0.17134.0(Windows 10, Windows 10) 프로젝트에서 최소 Windows SDK 대상 버전이 필요합니다. 버전 1803).
Visual Studio 2022는 C++/WinRT 프로젝트 및 항목 템플릿이 기본 제공되므로 C++/WinRT 개발을 즉시 시작할 수 있습니다. 또한 C++/WinRT 프로젝션된 형식의 Visual Studio 네이티브 디버그 시각화(natvis)와 함께 제공됩니다. C# 디버깅과 유사한 환경을 제공합니다. Natvis는 디버그 빌드에 대해 자동으로 수행됩니다. 자세한 내용은 C++/WinRT대한 Visual Studio 네이티브 디버그 시각화
이전 버전의 Visual Studio를 사용할 경우, Visual Studio Marketplace에서 최신 버전의 C++/WinRT Visual Studio Extension (VSIX)를 다운로드하고 설치하세요.
- VSIX 확장은 Visual Studio에서 C++/WinRT 프로젝트 및 항목 템플릿을 제공합니다.
- 또한 C++/WinRT 프로젝션된 형식에 대한 Visual Studio의 네이티브 디버그 시각화(natvis)를 제공합니다.
C++/WinRT용 Visual Studio 프로젝트 템플릿은 아래 섹션에 설명되어 있습니다. 최신 버전의 VSIX 확장이 설치된 새 C++/WinRT 프로젝트를 만들면 새 C++/WinRT 프로젝트는 microsoft.Windows.CppWinRT NuGet 패키지
또는 Microsoft.Windows.CppWinRT NuGet 패키지를 수동으로 설치하여 기존 프로젝트를 변환할 수 있습니다. 최신 버전의 VSIX 확장을 설치(또는 업데이트)한 후 Visual Studio에서 기존 프로젝트를 열고 cppwinrt.exe
도구 호출을 포함하여 프로젝트에 대한 C++/WinRT MSBuild 지원을 받게 됩니다.
중요합니다
1.0.190128.4 이전 버전의 VSIX 확장으로 만든 프로젝트나 해당 버전과 호환되도록 업그레이드된 프로젝트가 있는 경우, 이전 버전의 VSIX 확장에 대한 세부사항은 그리고을 참조하세요. 이 섹션에는 프로젝트의 구성에 대한 중요한 정보가 포함되어 있습니다. 이 정보는 최신 버전의 VSIX 확장을 사용하도록 업그레이드하는 데 알아야 합니다.
- C++/WinRT는 C++17 표준의 기능을 사용하므로 NuGet 패키지는 Visual Studio에서 프로젝트 속성 C/C++>Language>C++ 언어 표준>ISO C++17 표준(/std:c++17) 설정합니다.
- 또한 /bigobj 컴파일러 옵션도 추가합니다.
-
사용하도록 설정하기 위해
co_await
컴파일러 옵션을 추가합니다. - XAML 컴파일러에 C++/WinRT codegen을 내보내도록 지시합니다.
- 또한 일치 모드를 예 (/permissive-)로 설정하여 코드를 표준 준수로 더욱 엄격히 제한할 수 있습니다.
- 알아야 할 또 다른 프로젝트 속성은 C/C++>일반>경고를 오류처리합니다.
예(/WX) 또는 아니요(/WX-)에 맞게 설정하세요. 경우에 따라
cppwinrt.exe
도구에서 생성된 원본 파일은 구현을 추가할 때까지 경고를 생성합니다.
위에서 설명한 대로 시스템을 설정하면 Visual Studio에서 C++/WinRT 프로젝트를 만들고 빌드하거나 열고 배포할 수 있습니다.
버전 2.0을 기준으로 Microsoft.Windows.CppWinRT NuGet 패키지에는 cppwinrt.exe
도구가 포함되어 있습니다. 윈도우 런타임 메타데이터(cppwinrt.exe
) 파일에 .winmd
도구를 지정하면, 메타데이터에 설명된 API를 C++/WinRT 코드에서 사용할 수 있도록 하는 헤더 파일 기반의 표준 C++ 라이브러리를 생성하는 프로젝트를 만들 수 있습니다. Windows 런타임 메타데이터(.winmd
) 파일은 Windows 런타임 API 화면을 설명하는 정식 방법을 제공합니다. 메타데이터에 cppwinrt.exe
을 가리키면, 이차 또는 타사 Windows 런타임 구성 요소에서 구현되거나 사용자 자신의 애플리케이션에서 구현된 런타임 클래스와 함께 사용할 수 있는 라이브러리를 생성할 수 있습니다. 자세한 내용은 C++/WinRT API 사용를 참조하세요.
C++/WinRT를 사용하면 COM 스타일 프로그래밍에 의존하지 않고 표준 C++를 사용하여 고유한 런타임 클래스를 구현할 수도 있습니다. 런타임 클래스의 경우, IDL 파일에서 형식을 설명하기만 하면, midl.exe
와 cppwinrt.exe
이 자동으로 임플리멘테이션 상용구 소스 코드 파일을 생성합니다. 또는 C++/WinRT 기본 클래스에서 파생하여 인터페이스를 구현할 수도 있습니다. 자세한 내용은 C++/WinRT와 관련된 Author API을 참조하세요.
프로젝트 속성을 통해 설정된 cppwinrt.exe
도구에 대한 사용자 지정 옵션 목록은 Microsoft.Windows.CppWinRT NuGet 패키지 추가 정보참조하세요.
프로젝트 내에 설치된 Microsoft.Windows.CppWinRT NuGet 패키지가 있으면 C++/WinRT MSBuild 지원을 사용하는 프로젝트를 식별할 수 있습니다.
VSIX 확장에서 제공하는 Visual Studio 프로젝트 템플릿은 다음과 같습니다.
빈 앱 (C++/WinRT)
XAML 사용자 인터페이스가 있는 UWP(유니버설 Windows 플랫폼) 앱에 대한 프로젝트 템플릿입니다.
Visual Studio는 각 XAML 태그 파일 뒤에 있는 IDL(Interface Definition Language)(.idl
) 파일에서 구현 및 헤더 스텁을 생성하는 XAML 컴파일러 지원을 제공합니다. IDL 파일에서 앱의 XAML 페이지에서 참조하려는 로컬 런타임 클래스를 정의한 다음 프로젝트를 한 번 빌드하여 Generated Files
구현 템플릿을 생성하고 Generated Files\sources
스텁 형식 정의를 생성합니다. 그런 다음 참조에 해당 스텁 형식 정의를 사용하여 로컬 런타임 클래스를 구현합니다.
런타임 클래스를 Midl 파일(.idl)로 팩터링하기 참조.
Visual Studio for C++/WinRT의 XAML 디자인 화면 지원은 C#의 패리티에 가깝습니다. Visual Studio에서 속성 창의 이벤트 탭을 사용하여 C++/WinRT 프로젝트 내에 이벤트 처리기를 추가할 수 있습니다. 코드에 이벤트 처리기를 수동으로 추가할 수도 있습니다. 자세한 내용은 C++/WinRT 대리자를 사용하여 이벤트 처리
핵심 앱(C++/WinRT)
XAML을 사용하지 않는 UWP(유니버설 Windows 플랫폼) 앱용 프로젝트 템플릿입니다.
대신 Windows.ApplicationModel.Core 네임스페이스에 대해 C++/WinRT Windows 네임스페이스 헤더를 사용합니다. 빌드하고 실행한 후 빈 공간을 클릭하여 색이 지정된 사각형을 추가합니다. 그런 다음 색이 지정된 사각형을 클릭하여 끌어옵니다.
Windows 콘솔 애플리케이션(C++/WinRT)
콘솔 사용자 인터페이스가 있는 Windows Desktop용 C++/WinRT 클라이언트 애플리케이션에 대한 프로젝트 템플릿입니다.
Windows 데스크톱 애플리케이션(C++/WinRT)
Windows 데스크톱용 C++/WinRT 클라이언트 애플리케이션용 프로젝트 템플릿으로, Win32 MessageBox내에 Windows 런타임 Windows.Foundation.Uri 표시합니다.
Windows 런타임 구성 요소(C++/WinRT)
구성 요소에 대한 프로젝트 템플릿입니다. 일반적으로 UWP(유니버설 Windows 플랫폼)에서 사용할 수 있습니다.
이 템플릿은 IDL에서 Windows 런타임 메타데이터(midl.exe
)가 생성된 다음 Windows 런타임 메타데이터에서 구현 및 헤더 스텁이 생성되는 >cppwinrt.exe
.winmd
도구 체인을 보여 줍니다.
IDL 파일에서 구성 요소의 런타임 클래스, 기본 인터페이스 및 구현하는 기타 인터페이스를 정의합니다. 프로젝트를 한 번 빌드하여 module.g.cpp
, module.h.cpp
, Generated Files
구현 템플릿 및 Generated Files\sources
스텁 형식 정의를 생성합니다. 그 후에 스텁 형식 정의를 참조하여 귀하의 구성 요소에서 런타임 클래스를 구현합니다.
런타임 클래스를 Midl 파일(.idl)로 팩터링하기 참조.
빌드된 Windows 런타임 구성 요소 이진 파일과 해당 .winmd
를 번들로 묶어 그것들을 사용하는 UWP 앱에 포함시킵니다.
이전 버전의 VSIX 확장
최신 버전의 VSIX 확장설치하거나 업데이트하는 것이 좋습니다. 기본적으로 업데이트하도록 구성됩니다. 이렇게 하고 1.0.190128.4 이전 버전의 VSIX 확장으로 만든 프로젝트가 있는 경우 이 섹션에는 새 버전에서 작동하도록 해당 프로젝트를 업그레이드하는 방법에 대한 중요한 정보가 포함되어 있습니다. 업데이트하지 않더라도 이 섹션의 정보를 여전히 유용하게 여길 수 있습니다.
지원되는 Windows SDK 및 Visual Studio 버전 및 Visual Studio 구성 측면에서 위의 C++/WinRT, XAML, VSIX 확장 및 NuGet 패키지 섹션에 대한
1.0.181002.2보다 일찍 생성됨
1.0.181002.2 이전 버전의 VSIX 확장으로 프로젝트를 만든 경우 C++/WinRT 빌드 지원이 해당 버전의 VSIX 확장에 기본 제공되었습니다. 귀하의 프로젝트는 <CppWinRTEnabled>true</CppWinRTEnabled>
파일에 .vcxproj
속성이 설정되어 있습니다.
<Project ...>
<PropertyGroup Label="Globals">
<CppWinRTEnabled>true</CppWinRTEnabled>
...
Microsoft.Windows.CppWinRT NuGet 패키지를 수동으로 설치하여 프로젝트를 업그레이드할 수 있습니다. 최신 버전의 VSIX 확장을 설치(또는 업그레이드)한 후 Visual Studio에서 프로젝트를 열고
1.0.181002.2에서 1.0.190128.3 사이에서 생성(또는 업그레이드됨)
1.0.181002.2에서 1.0.190128.3 사이의 VSIX 확장 버전을 사용하여 프로젝트를 만든 경우 Microsoft.Windows.CppWinRT NuGet 패키지가 프로젝트 템플릿에 의해 프로젝트에 자동으로 설치됩니다. 이 범위의 VSIX 확장 버전을 사용하도록 이전 프로젝트를 업그레이드했을 수도 있습니다. 만약 당신이 그렇게 했다면—빌드 지원이 이 범위의 VSIX 확장 버전에서도 계속 제공되었기 때문에—업그레이드된 프로젝트에 Microsoft.Windows.CppWinRT NuGet 패키지가 설치되어 있을 수도 있고 없을 수도 있습니다.
프로젝트를 업그레이드하려면 이전 섹션의 지침에 따라 프로젝트에 Microsoft.Windows.CppWinRT NuGet 패키지가 설치되어 있는지 확인합니다.
잘못된 업그레이드 구성
최신 버전의 VSIX 확장에서는 <CppWinRTEnabled>true</CppWinRTEnabled>
NuGet 패키지가 설치되어 있지 않은 경우 프로젝트에 속성이 있는 것은 유효하지 않습니다. 이 구성을 사용하는 프로젝트는 빌드 오류 메시지를 생성합니다. "C++/WinRT VSIX는 더 이상 프로젝트 빌드 지원을 제공하지 않습니다. Microsoft.Windows.CppWinRT Nuget 패키지에 프로젝트 참조를 추가하세요."
위에서 설명한 대로 C++/WinRT 프로젝트는 이제 NuGet 패키지를 설치해야 합니다.
<CppWinRTEnabled>
요소는 이제 사용되지 않으므로 필요하면 .vcxproj
을 편집한 후 요소를 삭제할 수 있습니다. 반드시 필요한 것은 아니지만 옵션입니다.
또한 .vcxproj
<RequiredBundles>$(RequiredBundles);Microsoft.Windows.CppWinRT</RequiredBundles>
포함하는 경우 C++/WinRT VSIX 확장을 설치하지 않고 빌드할 수 있도록 제거할 수 있습니다.
C++/WinRT에 대한 SDK 지원
Windows SDK는 일차적 Windows API(Windows 네임스페이스의 Windows 런타임 API)를 사용하기 위한 헤더 파일 기반 표준 C++ 라이브러리를 포함하고 있으며, 이는 주로 호환성 이유로만 존재합니다. 이러한 지원은 버전 10.0.17134.0(Windows 10, 버전 1803)부터 시작되었습니다. 이러한 헤더는 폴더 %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt
내에 있습니다. Windows SDK 버전 10.0.17763.0(Windows 10 버전 1809)부터 이러한 헤더는 프로젝트의 $(GeneratedFilesDir) 폴더 내에 생성됩니다.
호환성을 위해 Windows SDK에는 cppwinrt.exe
도구도 함께 제공됩니다. 그러나 저희는 대신 cppwinrt.exe
NuGet 패키지에 포함된 최신 버전의 을 설치하고 사용할 것을 권장합니다. 해당 패키지 및 cppwinrt.exe
위의 섹션에 설명되어 있습니다.
C++/WinRT 프로젝션의 사용자 지정 형식
C++/WinRT 프로그래밍에서는 표준 C++ 언어 기능과 표준 C++ 데이터 형식 및 C++/WinRT사용할 수 있습니다(일부 C++ 표준 라이브러리 데이터 형식 포함). 그러나 프로젝션에서 일부 사용자 지정 데이터 형식을 인식하게 되고 이를 사용하도록 선택할 수도 있습니다. 예를 들어, 시작하기 위한 코드 예제에서 winrt::hstring를 사용합니다. 이는 C++/WinRT에서 확인할 수 있습니다.
winrt::com_array 특정 시점에 사용할 수 있는 또 다른 형식입니다. 그러나 winrt::array_view같은 형식을 직접 사용할 가능성이 적습니다. 또는 C++ 표준 라이브러리에 동등한 형식이 등장할 경우, 이를 사용하지 않기로 선택하여 코드 변경의 번거로움을 피할 수 있습니다.
경고
C++/WinRT Windows 네임스페이스 헤더를 정밀하게 분석하면 발견할 수 있는 형식도 있습니다. 예를 들어 winrt::param::hstring이 있으며, 컬렉션 예제도 있습니다. 이는 입력 매개 변수의 바인딩을 최적화하기 위해서만 존재하며, 성능이 크게 향상되고 관련 표준 C++ 형식 및 컨테이너에 대해 대부분의 호출 패턴이 "작동"합니다. 이러한 형식은 가장 큰 가치를 제공하는 경우에만 프로젝션에서 사용됩니다. 고도로 최적화되어 있으며 일반적인 용도로는 사용되지 않습니다. 직접 사용하려는 유혹을 받지 마십시오. 구현 형식이기 때문에 변경될 수 있으므로 winrt::impl
네임스페이스의 사용을 피해야 합니다. 표준 형식 또는 winrt 네임스페이스의 형식을 계속 사용해야 합니다.
또한 매개변수를 ABI 경계에 전달하는 것을 참조하세요.