메모
프로젝트 템플릿 지원을 제공하는 VSIX(C++/WinRT Visual Studio Extension)를 설치하고 사용하는 방법에 대한 자세한 내용은 C++/WinRT에 대한 Visual Studio 지원을 참조하세요.
이 항목은 바로 인식할 수 있도록 맨 앞에 있습니다. 아직 필요하지 않더라도 아래의 증상 및 해결 문제 해결 표는 새 코드를 잘라내거나 기존 앱을 포팅하는 데 도움이 될 수 있습니다. 포팅 작업을 하는 중이고 프로젝트가 빌드되고 실행되는 단계에 빨리 이르기를 원한다면, 문제를 일으키는 비핵심 코드를 주석 처리하거나 스텁으로 대체해 일시적으로 앞으로 나아간 다음, 나중에 돌아와 그 부채를 해결하면 됩니다.
질문과 대답 목록은 질문과 대답을 참조하세요.
XAML 문제 추적
특히 예외 내에 의미 있는 오류 메시지가 없는 경우 XAML 구문 분석 예외를 진단하기 어려울 수 있습니다. 디버거가 최초 발생 예외를 포착하도록 구성되어 있는지 확인하세요(파싱 예외를 초기에 포착하기 위해). 디버거에서 예외 변수를 검사하여 HRESULT 또는 메시지에 유용한 정보가 있는지 여부를 확인할 수 있습니다. 또한 Visual Studio 출력 창에서 XAML 파서의 오류 메시지 출력을 확인합니다.
앱이 종료되고 XAML 마크업을 구문 분석하는 동안 처리되지 않은 예외가 발생했다는 것만 알고 있다면, 이는 없는 리소스를 키로 참조한 결과일 수 있습니다. 또는 UserControl, 사용자 지정 컨트롤 또는 사용자 지정 레이아웃 패널 내부에서 발생한 예외일 수 있습니다. 최후의 수단은 이진 분할입니다. XAML 페이지에서 태그의 약 절반을 제거하고 앱을 다시 실행합니다. 그런 다음 오류가 제거한 절반 내에 있는지(어떤 경우든 복원해야 합니다) 또는 제거하지 않은 절반에 있는지 여부를 알 수 있습니다. 오류가 포함된 절반을 다시 나누는 방식으로 이 과정을 반복하여, 문제를 정확히 찾아낼 때까지 계속합니다.
증상 및 해결
| 증상 | 해결 방법 |
|---|---|
| 런타임에 HRESULT 값이 REGDB_E_CLASSNOTREGISTERED인 예외가 발생합니다. | "등록되지 않은 클래스" 예외가 표시되는 이유를 참조하세요. |
| C++ 컴파일러는 "'implements_type': '<프로젝션된 형식>'의 직접 또는 간접 기본 클래스의 멤버가 아닙니다"라는 오류를 생성합니다. | 이 문제는 구현 형식의 네임스페이스 정규화되지 않은 이름(예: MyRuntimeClass)으로 make를 호출하고 해당 형식의 헤더를 포함하지 않은 경우에 발생할 수 있습니다. 컴파일러는 MyRuntimeClass 를 프로젝션된 형식으로 해석합니다. 솔루션은 구현 형식에 대한 헤더를 포함하는 것입니다(MyRuntimeClass.h예: ). |
| C++ 컴파일러는 "삭제된 함수를 참조하려고 시도"하는 오류를 생성합니다. | 이 문제는 make 를 호출하고 템플릿 매개 변수로 전달하는 구현 형식에 기본 생성자가 있는 = delete 경우에 발생할 수 있습니다. 구현 형식의 헤더 파일을 편집하고 = delete를 = default로 변경합니다. 런타임 클래스의 IDL에 생성자를 추가할 수도 있습니다. |
| INotifyPropertyChanged를 구현했지만 XAML 바인딩이 업데이트되지 않고 UI가 PropertyChanged를 구독하지 않습니다. | XAML 마크업의 바인딩 식에서 Mode=OneWay(또는 TwoWay)를 설정해야 합니다.
XAML 컨트롤을 참조하세요. C++/WinRT 속성에 바인딩합니다. |
| XAML ItemsControl을 관찰 가능한 컬렉션에 바인딩할 때 런타임에 "매개 변수가 잘못되었습니다"라는 메시지와 함께 예외가 발생합니다. | IDL과 구현 코드에서 관찰 가능한 모든 컬렉션을 형식 Windows.Foundation.Collections.IVector<IInspectable>으로 선언하세요. 하지만 Windows.Foundation.Collections.IObservableVector<T>를 구현하는 개체를 반환합니다. 여기서 T는 요소 형식입니다. XAML 항목 컨트롤을 참조하세요. C++/WinRT 컬렉션에 바인딩합니다. |
| C++ 컴파일러는 "'MyImplementationType_base<MyImplementationType>': 사용할 수 있는 적절한 기본 생성자가 없음" 형식의 오류를 생성합니다. | 이는 비트리비얼 생성자를 가진 형식에서 파생된 경우 발생할 수 있습니다. 파생 형식의 생성자는 기본 형식의 생성자에 필요한 매개 변수를 전달해야 합니다. 예제는 비단순 생성자를 가진 형식에서 파생하기를 참조하세요. |
| C++ 컴파일러는 "'const std::vector<std::wstring,std::allocator<_Ty>>'에서 'const winrt::param::async_iterable<winrt::hstring> &'(으)로 변환할 수 없습니다"라는 오류를 출력합니다. | 이는 std::wstring의 std::vector를 컬렉션을 예상하는 Windows 런타임 API에 전달할 때 발생할 수 있습니다. 자세한 내용은 표준 C++ 데이터 형식 및 C++/WinRT를 참조하세요. |
| C++ 컴파일러는 "'const std::vector<winrt::hstring,std::allocator<_Ty>>'에서 'const winrt::param::async_iterable<winrt::hstring> &'(으)로 변환할 수 없습니다" 오류를 발생시킵니다. | 이 문제는 winrt::hstring의 std::vector를 컬렉션을 예상하는 비동기 Windows 런타임 API에 전달하고 벡터를 비동기 호출 수신자로 복사하거나 이동하지 않은 경우에 발생할 수 있습니다. 자세한 내용은 표준 C++ 데이터 형식 및 C++/WinRT를 참조하세요. |
| 프로젝트를 열 때 Visual Studio "프로젝트에 대한 애플리케이션이 설치되지 않았습니다."라는 오류가 발생합니다. | 아직 설치하지 않은 경우 Windows 앱 SDK C++ 템플릿 및 C++/WinRT Visual Studio 확장(VSIX)을 설치해야 합니다(C++/WinRT에 대한 Visual Studio 지원 참조). |
| Windows 앱 인증 키트 테스트는 런타임 클래스 중 하나가 "Windows 기본 클래스에서 파생되지 않는다는 오류를 생성합니다. 모든 구성 가능한 클래스는 궁극적으로 Windows 네임스페이스의 형식에서 파생되어야 합니다. | 기본 클래스에서 파생되는 모든 런타임 클래스(애플리케이션에서 선언)를 작성 가능한 클래스라고 합니다. 작성 가능한 클래스의 최종 기본 클래스는 Windows.* 또는 Microsoft.* 네임스페이스에서 시작되는 형식이어야 합니다(예: Microsoft). Ui. Xaml.DependencyObject. 자세한 내용은 XAML 컨트롤; C++/WinRT 속성에 바인딩을 참조하세요. |
| C++ 컴파일러는 EventHandler 또는 TypedEventHandler 대리자 특수화에 대해 "T는 WinRT 형식이어야 합니다" 오류를 생성합니다. | winrt::delegate<...T>를 대신 사용하는 것을 고려하세요. C++/WinRT의 Author 이벤트를 참조하세요. |
| C++ 컴파일러는 Windows 런타임 비동기 작업 특수화에 대해 "T는 WinRT 형식이어야 합니다" 오류를 생성합니다. | 대신 PPL(병렬 패턴 라이브러리) 작업을 반환하는 것이 좋습니다. 동시성 및 비동기 작업을 참조하세요. |
| C++ 컴파일러는 winrt::xaml_typename 호출할 때 "T는 WinRT 형식이어야 합니다" 오류를 생성합니다. | 구현 형식이 아닌 winrt::xaml_typename (예: BgLabelControlApp::BgLabelControl 사용)과 함께 프로젝션된 형식을 사용합니다(예: BgLabelControlApp::implementation::BgLabelControl을 사용하지 마세요). XAML 사용자 지정(템플릿 지정) 컨트롤을 참조하세요. |
| C++ 컴파일러는 "오류 C2220: 오류로 처리된 경고 - 'object' 파일이 생성되지 않음"을 생성합니다. | 경고를 수정하거나 C/C++>일반>경고를 오류로 처리를 아니요 (/WX-)로 설정하세요. |
| 개체가 제거된 후 C++/WinRT 개체의 이벤트 처리기가 호출되므로 앱이 충돌합니다. | 이벤트 처리 대리자를 사용하여 이 포인터에 안전하게 액세스하는 방법을 참조하세요. |
| C++ 컴파일러는 "오류 C2338: 약한 참조 지원에만 해당"을 생성합니다. | winrt::no_weak_ref 표식 구조체를 기본 클래스에 템플릿 인수로 전달한 형식에 대한 약한 참조를 요청하고 있습니다. 약한 참조 지원 사용 안 함을 참고하세요. |
| C++ 컴파일러는 "consume_Something: 'auto'를 반환하는 함수를 정의하기 전에 사용할 수 없음"을 생성합니다. | C3779: 컴파일러가 "consume_Something: 'auto'를 반환하는 함수는 정의되기 전에 사용할 수 없습니다" 오류를 표시하는 이유는 무엇인가요?를 참조하세요. |
| C++ 링커는 "오류 LNK2019: 해결되지 않은 외부 기호"를 생성합니다. | "링커에서 'LNK2019: 확인할 수 없는 외부 기호' 오류가 발생하는 이유는 무엇인가요?"를 참조하세요. |
| LLVM 및 Clang 도구 체인은 C++/WinRT와 함께 사용할 때 오류를 생성합니다. | C++/WinRT용 LLVM 및 Clang 도구 체인은 지원되지 않지만 내부적으로 사용하는 방법을 에뮬레이트하려는 경우 LLVM/Clang를 사용하여 C++/WinRT로 컴파일할 수 있나요?에 설명된 것과 같은 실험을 시도할 수 있습니다. |
| C++ 컴파일러는 프로젝션된 형식에 대해 "사용할 수 있는 적절한 기본 생성자가 없음"을 생성합니다. | 런타임 클래스 개체의 초기화를 지연하거나 동일한 프로젝트에서 런타임 클래스를 사용하고 구현하려는 경우 std::nullptr_t 생성자를 호출해야 합니다. 자세한 내용은 C++/WinRT를 사용하여 API 사용을 참조하세요. |
| C++ 컴파일러는 "오류 C3861: 'from_abi': 식별자를 찾을 수 없음"과 base.h에서 발생하는 기타 오류를 생성합니다. Visual Studio 2017(버전 15.8.0 이상)을 사용하고 Windows SDK 버전 10.0.17134.0(Windows 10, 버전 1803)을 대상으로 하는 경우 이 오류가 표시될 수 있습니다. | Windows SDK의 이후 버전(더 규격을 잘 준수하는 버전)을 대상으로 하거나, 프로젝트 속성 C/C++>언어>규칙 준수 모드: 아니요로 설정하세요(또한 프로젝트 속성 C/C++>언어>명령줄의 추가 옵션 아래에 /permissive-가 표시되면 이를 삭제하세요). |
| C++ 컴파일러는 "오류 C2039: 'IUnknown': ''global 네임스페이스'의 멤버가 아닙니다"를 생성합니다. | C++/WinRT 프로젝트를 최신 버전의 Windows SDK로 대상을 다시 지정하는 방법을 참조하세요. |
| C++ 링커는 "오류 LNK2019: 함수 _VSDesignerCanUnloadNow@0에서 참조되는 확인할 수 없는 외부 기호 _WINRT_CanUnloadNow@0"를 생성합니다. | C++/WinRT 프로젝트를 최신 버전의 Windows SDK로 대상을 다시 지정하는 방법을 참조하세요. |
| 빌드 프로세스에서 C++/WinRT VSIX가 더 이상 프로젝트 빌드 지원을 제공하지 않는 오류 메시지를 생성합니다. Microsoft.Windows 프로젝트 참조를 추가하세요. CppWinRT Nuget 패키지. | 프로젝트에 Microsoft.Windows.CppWinRT NuGet 패키지를 설치하세요. 자세한 내용은 이전 버전의 VSIX 확장을 참조하세요. |
| C++ 링커는 winrt::impl::consume_Windows_Foundation_Collections_IVector 대한 언급과 함께 해결되지 않은 외부 기호와 같은 오류 LNK2019 생성합니다. |
C++/WinRT 2.0부터는 Windows 런타임 컬렉션에서 for 기반 범위를 사용하는 경우 이제 #include <winrt/Windows.Foundation.Collections.h>해야 합니다. |
| C++ 컴파일러는 "오류 C4002: 함수와 유사한 매크로 호출 GetCurrentTime에 대한 인수가 너무 많음"을 생성합니다. | GetCurrentTime 및/또는 TRY를 사용하여 모호성을 해결하는 방법을 참조하세요. |
| C++ 컴파일러는 "오류 C2334: '{' 앞에 예기치 않은 토큰이 있습니다. 함수 본문으로 보이는 부분을 건너뜁니다."를 표시합니다. | GetCurrentTime 및/또는 TRY를 사용하여 모호성을 해결하는 방법을 참조하세요. |
| C++ 컴파일러는 "winrt::impl::produce<D,I>에서 GetBindingConnector가 누락되어 추상 클래스를 인스턴스화할 수 없습니다"라는 메시지를 출력합니다. | 을(를) 수행해야 합니다 #include <winrt/Microsoft.UI.Xaml.Markup.h>. |
| C++ 컴파일러는 "오류 C2039: 'promise_type': 'std::experimental::coroutine_traits<void>'의 멤버가 아닙니다"를 생성합니다. | 코루틴은 비동기 작업 개체 또는 winrt::fire_and_forget를 반환해야 합니다. 동시성 및 비동기 작업을 참조하세요. |
| 프로젝트는 "'PopulatePropertyInfoOverride'의 모호한 액세스"를 생성합니다. | 이 오류는 IDL에서 하나의 기본 클래스와 XAML 태그에서 다른 기본 클래스를 선언할 때 발생할 수 있습니다. |
| C++/WinRT 솔루션을 처음으로 로드하면 "프로젝트 'MyProject.vcxproj' 구성 '디버그|x86'에 대한 Designtime 빌드 실패"가 생성됩니다. IntelliSense를 사용할 수 없습니다.". | 이 IntelliSense 문제는 처음 빌드한 후에 해결됩니다. |
| 대리자를 등록할 때 winrt::auto_revoke를 지정하려고 시도하면 winrt::hresult_no_interface 예외가 발생합니다. | 자동 취소 위임 등록에 실패하는 경우를 참조하세요. |
| C++/WinRT 앱에서 XAML을 사용하는 C# Windows 런타임 구성 요소를 사용할 때 컴파일러는 "'MyNamespace_XamlTypeInfo': 'winrt::MyNamespace'의 멤버가 아닌" 형식의 오류를 생성합니다. 여기서 MyNamespace는 Windows 런타임 구성 요소 네임스페이스의 이름입니다. | 사용하는 C++/WinRT 앱의 pch.h에서 #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>를 추가합니다. 이때 필요에 따라 MyNamespace를 바꿉니다. |
| Visual Studio C++/WinRT 프로젝트에서 IntelliSense는 "오류 E1696: 파일을 오픈 소스 수 없음" 형식의 오류를 생성합니다. | 새로 만든 프로젝트를 한 번 이상 컴파일합니다. 그런 다음 소스 코드 편집기>에서 마우스 오른쪽 버튼을 클릭한 다음 다시 검사>파일 다시 검사를 선택합니다. 그러면 E1696을 비롯한 모든 IntelliSense 오류가 해결됩니다. |
메모
이 항목에서 질문에 답변하지 않은 경우 Visual Studio C++ 개발자 커뮤니티를 방문하거나 Stack Overflow에서 태그를 사용하여 도움말을c++-winrt 찾을 수 있습니다.
관련 항목
메모
많은 C++/WinRT 항목이 UWP 설명서에서 이 섹션으로 마이그레이션되는 중입니다. 마이그레이션이 완료될 때까지 아래 목록의 링크는 UWP 문서 섹션으로 이어질 수 있습니다. C++/WinRT 언어 프로젝션은 UWP 및 WinUI 3 앱 모두에 대해 동일하므로 콘텐츠가 두 컨텍스트에서 모두 적용됩니다. UWP 관련 패턴(예: 앱 수명 주기 또는 Windows.UI 네임스페이스 API)은 해당 문서에서 명시적으로 설명합니다.
Windows developer