비고
프로젝트 템플릿 지원을 제공하는
이 주제는 바로 알아챌 수 있도록 맨 앞에 배치되었습니다. 아직 필요하지 않더라도 지금 알아두세요. 아래의 증상 및 해결 문제 해결 표는 새 코드를 잘라내거나 기존 앱을 포팅하는 데 도움이 될 수 있습니다. 포팅 작업을 진행 중이며 프로젝트의 빌드 및 실행 단계에 빠르게 도달하고자 한다면, 문제를 일으키는 중요하지 않은 코드를 주석 처리하거나 스텁 처리하여 임시로 진행할 수 있으며, 이후에 해당 빚을 갚기 위해 돌아올 수 있습니다.
질문과 대답 목록은
XAML 문제 추적
특히 예외 내에 의미 있는 오류 메시지가 없는 경우 XAML 구문 분석 예외를 진단하기 어려울 수 있습니다. 디버거가 최초로 발생하는 예외를 포착하도록 구성되어 있는지 확인합니다(구문 파싱 예외를 초기에 포착하고 그 처리를 시도하기 위해). 디버거에서 예외 변수를 검사하여 HRESULT 또는 메시지에 유용한 정보가 있는지 여부를 확인할 수 있습니다. 또한 Visual Studio의 출력 창에서 XAML 파서의 오류 메시지 출력을 확인합니다.
앱이 종료되고 XAML 마크업 구문 분석 중 처리되지 않은 예외가 발생한 경우, 이는 누락된 리소스에 대한 키 참조로 인한 결과일 수 있습니다. 사용자 컨트롤, 사용자 지정 컨트롤, 또는 사용자 지정 레이아웃 패널 내부에서 발생하는 예외일 수도 있습니다. 최후의 수단은 이진 분할입니다. XAML 페이지에서 마크업의 약 절반을 제거하고 앱을 다시 실행합니다. 그런 다음 오류가 제거한 절반 내에 있는지(어떤 경우든 복원해야 합니다) 또는 제거하지 않은 절반에 있는지 여부를 알 수 있습니다. 오류가 포함된 절반을 계속 분할하여 문제를 정확히 찾을 때까지 프로세스를 반복합니다.
증상 및 해결
증상 | 치료법 / 해결책 |
---|---|
런타임에 HRESULT 값이 REGDB_E_CLASSNOTREGISTERED 인 예외가 발생합니다. | "등록되지 않은 클래스" 예외가 표시되는 이유는 참조하세요.. |
C++ 컴파일러는 "'implements_type'오류가 생성됩니다. '<프로젝션된 형식>'"의 직접 또는 간접 기본 클래스의 멤버가 아닙니다. | 이 문제는 구현 형식의 네임스페이스 정규화되지 않은 이름(예: MyRuntimeClassMyRuntimeClass.h ). |
C++ 컴파일러는 "삭제된 함수을 참조하려고 시도하는 |
을 호출하여을 템플릿 매개 변수로 전달할 때, 전달된 구현 형식에 = delete 기본 생성자가 있는 경우 이러한 문제가 발생할 수 있습니다. 구현 형식의 헤더 파일을 편집하고 = delete = default 변경합니다. 런타임 클래스의 IDL에 생성자를 추가할 수도 있습니다. |
INotifyPropertyChanged를 |
XAML 구문에서 바인딩 표현식에 Mode=OneWay (또는 TwoWay)를 꼭 설정하세요. XAML 컨트롤 을 참조하고 C++/WinRT 속성에 바인딩하세요. |
XAML 아이템 컨트롤을 옵저버블 컬렉션에 바인딩할 때, 런타임에 "매개 변수가 잘못되었습니다"라는 메시지와 함께 예외가 발생합니다. | IDL 및 구현에서 관찰 가능한 컬렉션을 형식 Windows.Foundation.Collections.IVector<IInspectable>로 선언합니다. 그러나 해당 개체의 요소 형식이 T인 경우, |
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는 "프로젝트에 대한 애플리케이션이 설치되지 않은 |
아직 설치하지 않은 경우 Visual Studio의 |
Windows 앱 인증 키트 테스트는 런타임 클래스 "중 하나가 Windows 기본 클래스에서 파생되지 않는다는 오류를 생성합니다. 모든 구성 가능한 클래스는 궁극적으로 Windows 네임스페이스"의 형식에서 파생되어야 합니다. | 애플리케이션에서 선언한 기본 클래스에서 파생된 모든 런타임 클래스는 구성 가능한 클래스라고 합니다. 구성 가능한 클래스의 최종 기본 클래스는 Windows.* 네임스페이스에서 시작되는 형식이어야 합니다. 예를 들어 windows.UI.Xaml.DependencyObject |
C++ 컴파일러는 EventHandler 또는 TypedEventHandler 대리자 특수화에 대해 "T는 WinRT 형식이어야 합니다"라는 오류를 생성합니다. |
winrt::delegate<...T> 대신 사용해보세요. C++/WinRT에서 |
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++ 컴파일러는 "오류 C2039: 'IUnknown': ''global namespace''멤버가 아닙니다. | C++/WinRT 프로젝트를 Windows SDK최신 버전으로 대상을 다시 지정하는 방법에 |
C++ 링커는 "오류 LNK2019: 해결되지 않은 외부 기호 _WINRT_CanUnloadNow@0이 함수 _VSDesignerCanUnloadNow@0에서 참조되었습니다" 발생합니다. | C++/WinRT 프로젝트를 Windows SDK최신 버전으로 대상을 다시 지정하는 방법에 |
빌드 프로세스는 C++/WinRT VSIX가 더 이상 프로젝트 빌드 지원을 제공하지 않는 오류 메시지를 생성합니다. Microsoft.Windows.CppWinRT Nuget 패키지프로젝트 참조를 추가하세요. | 프로젝트에 Microsoft.Windows.CppWinRT NuGet 패키지를 설치합니다. 자세한 내용은 이전 버전의 VSIX 확장 |
C++ 링커는와 관련하여 해결되지 않은 외부 기호로 인해 |
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/Windows.UI.Xaml.Markup.h> 을(를) 해야 합니다. |
C++ 컴파일러는 "오류 C2039: 'promise_type'을 생성합니다. 'std::experimental::coroutine_traits<void>'"의 멤버가 아닙니다. | 코루틴은 비동기 작업 개체 또는 winrt::fire_and_forget반환해야 합니다. 동시성 및 비동기 작업참조하세요. |
프로젝트가 "'PopulatePropertyInfoOverride'의 모호한 액세스를" 생성합니다. | 이 오류는 IDL에서 하나의 기본 클래스와 XAML 태그에서 다른 기본 클래스를 선언할 때 발생할 수 있습니다. |
C++/WinRT 솔루션을 처음 로드하면 프로젝트 'MyProject.vcxproj'의 'Debug|x86' 구성에서 "디자인 타임 빌드에 실패했습니다. IntelliSense를 사용할 수 없을 수 있습니다.". | 이 IntelliSense 문제는 처음 빌드한 후에 해결됩니다. |
대리자를 등록할 때 winrt::auto_revoke을(를) 지정하려 시도하면 winrt::hresult_no_interface 예외가 발생합니다. | 자동 해지 대리자가등록하지 못하는 경우 |
C++/WinRT 앱에서 XAML을 사용하는 C# Windows Runtime 구성 요소를 사용할 때, 컴파일러가 "'MyNamespace_XamlTypeInfo': 'winrt::MyNamespace'의 멤버가 아닙니다"라는 형식의 오류를 발생시킵니다. 여기서 MyNamespace는 Windows Runtime 구성 요소의 네임스페이스 이름입니다. | 사용 중인 C++/WinRT 앱의 pch.h 에서 #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> 을 추가하고, 적절하게 MyNamespace를으로 대체하세요. |
Visual Studio의 C++/WinRT 프로젝트에서 IntelliSense는 "오류 E1696: "소스 파일을 열 수 없습니다" 형식의 오류를 생성합니다. | 새로 만든 프로젝트를 한 번 이상 컴파일합니다. 그런 다음 소스 코드 편집기에서 마우스 오른쪽 버튼을 클릭하고 >을 다시 검사한 다음>파일를 다시 검사합니다. 그러면 E1696을 비롯한 모든 IntelliSense 오류가 해결됩니다. |
비고
이 항목이 질문에 답변하지 않은 경우