Windows Runtime 8.x에서 UWP로 포팅 문제 해결

이전 토픽은 프로젝트 포팅입니다.

이 포팅 가이드를 끝까지 읽는 것을 강력하게 권장하지만, 직접 프로젝트를 빌드하고 실행하는 단계로 빨리 진행하고자 한다는 것도 알고 있습니다. 이를 위해 필수적이지 않은 코드를 주석으로 처리하거나 스텁한 다음, 나중에 해당 부채를 갚기 위해 돌아와서 일시적인 진전을 이룰 수 있습니다. 다음의 몇 가지 토픽을 읽는 대신 이 테이블의 문제 해결 증상 및 해결 방법을 사용하는 것은 불가능하지만, 이 테이블의 문제 해결 증상 및 해결 방법을 사용하는 것은 이 단계에서 도움이 될 수 있습니다. 이후의 토픽을 진행할 때 항상 테이블을 다시 참조할 수 있습니다.

문제 추적하기

XAML 구문 분석 예외를 진단하는 것은 예외 내에서 의미 있는 오류 메시지가 없는 경우에 특히 어려울 수 있습니다. 디버거가 (초기에 구문 분석 예외를 시도하여 catch하기 위해) 첫 번째 예외를 catch하도록 구성되었는지 확인합니다. HRESULT 또는 메시지에 유용한 정보가 있는지 여부를 디버거에서 예외 변수를 검사하여 확인할 수 있습니다. 또한 XAML 파서의 오류 메시지 출력을 Visual Studio의 출력 창에서 확인합니다.

앱이 종료되고 XAML 태그 구문 분석 중에 처리되지 않은 예외가 throw되었다는 것만 알고 있는 경우 누락된 리소스(즉, Universal 8.1 앱에는 키가 있지만 일부 시스템 TextBlock 스타일 키와 같이 Windows 10 앱에는 없는 리소스)에 대한 참조의 결과일 수 있습니다. 또는 UserControl, 사용자 지정 컨트롤 또는 사용자 지정 레이아웃 패널 내에서 예외가 throw되었을 수 있습니다.

이진 분할은 최후의 수단입니다. 페이지에서 태그의 절반 정도를 제거하고 앱을 다시 실행합니다. 그러면 오류가 제거한 절반(어떤 경우든지 지금 복원해야 함)에서 발생했는지 또는 제거하지 않은 절반에서 발생했는지를 알 수 있습니다. 오류가 격리된 절반을 문제가 없어질 때까지 분할하여 프로세스를 반복합니다.

TargetPlatformVersion

이 섹션은 Visual Studio에서 Windows 10 프로젝트를 여느 경우, "Visual Studio 업데이트가 필요하다는 메시지가 표시되었을 때 어떻게 해야 하는지를 설명합니다. 하나 이상의 프로젝트는 설치되지 않았거나 Visual Studio에 대한 향후 업데이트의 일부로 포함된 플랫폼 SDK <버전>을 필요로 합니다."

  • 먼저, 설치한 Windows 10용 SDK의 버전 번호를 확인합니다. C:\Program Files (x86)\Windows Kits\10\Include\<versionfoldername>으로 이동하여 4중 표기의 “Major.Minor.Build.Revision”인 <versionfoldername>을 기록합니다.
  • 프로젝트 파일을 열어 편집하고 TargetPlatformVersion 요소 및 TargetPlatformMinVersion 요소를 찾습니다. <versionfoldername>을 디스크에서 찾은 쿼드 표기법 버전 번호로 바꿔 다음과 같이 편집합니다.
   <TargetPlatformVersion><versionfoldername></TargetPlatformVersion>
    <TargetPlatformMinVersion><versionfoldername></TargetPlatformMinVersion>

증상에 대한 문제 해결 및 해결 방법

테이블의 해결 방법에 대한 정보는 차단을 해제할 수 있는 충분한 정보를 제공하기 위한 것입니다. 이러한 각 문제에 대한 자세한 내용은 이후의 토픽을 읽으면서 확인할 수 있습니다.

증상 해결 방법
Visual Studio에서 Windows 10 프로젝트를 열면, "Visual Studio 업데이트가 필요하다는 메시지가 표시됩니다. 하나 이상의 프로젝트는 설치되지 않았거나 Visual Studio에 대한 향후 업데이트의 일부로 포함된 플랫폼 SDK <버전>을 필요로 합니다." 이 토픽의 TargetPlatformVersion 섹션을 참조하세요.
InitializeComponent가 Xaml.cs 파일에서 호출되면 System.InvalidCastException이 throw됩니다. 이 문제는 동일한 xaml.cs 파일을 공유하는 둘 이상의 xaml 파일(MRT 한정 파일 중 하나 이상)이 있으며 요소에 두 xaml 파일 간에 일치하지 않는 x:Name 특성이 있는 경우에 발생할 수 있습니다. 두 xaml 파일의 동일한 요소에 동일한 이름을 추가하거나 이름을 모두 생략합니다.
장치에서 실행하는 경우 앱이 종료되거나 Visual Studio에서 시작한 경우 다음의 오류가 표시됩니다. “Windows Runtime 8.x 앱을 활성화할 수 없습니다[…]. 다음의 오류로 인해 활성화 요청이 실패했습니다. 'Windows에서 대상 애플리케이션과 통신할 수 없습니다. 일반적으로 이는 대상 애플리케이션의 프로세스가 중단되었음을 나타냅니다. 초기화 중에 사용자 고유의 페이지 또는 바인딩된 속성(또는 다른 형식)에서 실행되는 명령적 코드가 문제일 수 있습니다. 또는 앱이 종료될 때 표시될 XAML 파일을 구문 분석하는 동안 발생할 수 있습니다(Visual Studio에서 시작하는 경우 시작 페이지가 됨). 잘못된 리소스 키를 찾거나 이 토픽의 "문제 추적하기" 섹션에 있는 지침 중 일부를 시도해 보세요.
XAML 파서 또는 컴파일러 또는 런타임 예외는 "리소스 "<resourcekey>"를 확인할 수 없습니다."라는 오류를 보여 줍니다. 리소스 키는 UWP(Universal Windows Platform) 앱에 적용되지 않습니다(예를 들어 일부 Windows Phone 리소스의 경우). 해당하는 올바른 리소스를 찾은 다음 태그를 업데이트합니다. PhoneAccentBrush 등의 시스템 키는 바로 발생할 수 있는 예시입니다.
C# 컴파일러는 "형식 또는 네임스페이스 이름 '<name>'을 찾을 수 없습니다.[...]" 또는 "형식 또는 네임스페이스 이름 '<name>'이 네임스페이스[...]" 또는 "형식 또는 네임스페이스 이름 '<name>'이 현재 컨텍스트에 없습니다"라는 오류를 보여 줍니다. 이는 확장 SDK에서 형식이 구현됨을 의미할 수 있습니다(해결 방법이 그렇게 간단하지 않은 경우가 있을 수 있음). Windows API 참조 콘텐츠를 사용하여 SDK가 API를 구현하는 확장을 확인한 다음 Visual Studio의 참조추가>명령을 사용하여 해당 SDK에 대한 참조를 프로젝트에 추가합니다. 앱이 유니버설 장치 패밀리라고 하는 API 집합을 대상으로 하는 경우, ApiInformation 클래스를 사용하여 호출하기 전에 런타임에 확장 SDK가 있는지 테스트하는 것이 중요합니다(적응 코드라고 함). 유니버설 API가 있는 경우, 확장 SDK의 API보다 항상 선호됩니다. 자세한 정보는 확장 SDK를 참조하세요.

다음 토픽은 XAML 및 UI 포팅하기입니다.