Windows Phone Silverlight를 UWP로 포팅하는 문제 해결하기

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

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

문제 추적하기

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

앱이 종료되고 XAML 태그 구문 분석 중에 처리되지 않은 예외가 throw되었다는 것만 알고 있는 경우 누락된 리소스(즉, Windows Phone Silverlight 앱에는 키가 있지만 일부 시스템 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>

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

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

증상 해결 방법
XAML 파서 또는 컴파일러는 ""<typename>" 이름이 네임스페이스[...]에 없습니다."라는 오류를 보여 줍니다. <typename>이 사용자 지정 형식인 경우, XAML 태그의 네임스페이스 접두사 선언에서 "clr-namespace"를 "using"으로 변경하고 어셈블리 토큰을 제거합니다. 플랫폼 형식의 경우, 형식이 UWP(Universal Windows Platform)에 적용되지 않으므로 해당하는 항목을 찾아서 태그를 업데이트합니다. 바로 발생할 수 있는 예시로는 phone:PhoneApplicationPageshell:SystemTray.IsVisible이(가) 있습니다.
XAML 파서 또는 컴파일러에서 ""<membername>" 구성원을 인식할 수 없거나 액세스할 수 없습니다." 또는 ""<propertyname>" 속성을 [...] 형식에서 찾을 수 없습니다."라는 오류가 표시됩니다. 이러한 오류는 루트 페이지 등의 일부 형식 이름을 포팅한 뒤 표시되기 시작합니다. 구성원 또는 속성은 UWP에 적용되지 않으므로, 해당하는 항목을 찾아서 태그를 업데이트합니다. 바로 발생할 수 있는 예시로는 SupportedOrientationsOrientation이(가) 있습니다.
XAML 파서 또는 컴파일러에서 "연결 가능한 속성 [...]이(가) [...]에 없습니다." 또는 "연결 가능한 구성원 [...]을(를) 알 수 없습니다."라는 오류가 표시됩니다. 이는 연결된 속성이 아닌 형식에 의해 발생할 수 있으며, 이 경우 형식에 대한 오류가 이미 있으므로 이를 해결하면 이 오류가 사라지게 됩니다. 바로 발생할 수 있는 예시로는 phone:PhoneApplicationPage.Resourcesphone:PhoneApplicationPage.DataContext이(가) 있습니다.
XAML 파서 또는 컴파일러 또는 런타임 예외는 "리소스 "<resourcekey>"를 확인할 수 없습니다."라는 오류를 보여 줍니다. 리소스 키는 UWP(Universal Windows Platform) 앱에 적용되지 않습니다. 해당하는 올바른 리소스를 찾은 다음 태그를 업데이트합니다. 바로 발생할 수 있는 예시로는 PhoneTextNormalStyle 등의 시스템 TextBlock 스타일 키가 있습니다.
C# 컴파일러는 "형식 또는 네임스페이스 이름 '<name>'을 찾을 수 없습니다.[...]" 또는 "형식 또는 네임스페이스 이름 '<name>'이 네임스페이스[...]" 또는 "형식 또는 네임스페이스 이름 '<name>'이 현재 컨텍스트에 없습니다"라는 오류를 보여 줍니다. 이는 컴파일러가 아직 형식에 대한 올바른 UWP 네임스페이스를 알지 못한다는 것을 의미할 수 있습니다. Visual Studio의 Resolve 명령을 사용하여 이 문제를 해결합니다.
API가 유니버설 장치 패밀리라고 하는 API 집합에 없는 경우(즉, API는 확장 SDK에서 구현됨) 확장 SDK를 사용합니다.
포팅하기 덜 간단한 다른 경우가 있을 수 있습니다. 바로 발생할 수 있는 예시로는 DesignerPropertiesBitmapImage이(가) 있습니다.
앱이 종료되는 장치에서 실행했거나 Visual Studio에서 시작한 경우, 다음의 오류가 표시됩니다. “Windows Runtime 8.x 앱을 활성화할 수 없습니다[…]. 다음의 오류로 인해 활성화 요청이 실패했습니다. 'Windows에서 대상 애플리케이션과 통신할 수 없습니다. 일반적으로 이는 대상 애플리케이션의 프로세스가 중단되었음을 나타냅니다. [...]". 초기화 중에 사용자 고유의 페이지 또는 바인딩된 속성(또는 다른 형식)에서 실행되는 명령적 코드가 문제일 수 있습니다. 또는, 앱이 종료될 때 표시될 XAML 파일을 구문 분석하는 동안 발생할 수 있습니다(Visual Studio에서 시작하는 경우 시작 페이지가 됨). 잘못된 리소스 키를 찾거나 이 토픽의 문제 추적하기 섹션에 있는 지침 중 일부를 시도해 보세요.
XamlCompiler error WMC0055: 텍스트 값 '<스트림 기하 도형>'을 ‘RectangleGeometry' 형식의 'Clip' 속성에 할당할 수 없습니다. UWP에서 Microsoft DirectX 및 XAML C++ UWP 앱의 형식 입니다.
XamlCompiler error WMC0001: XML 네임스페이스 [...]의 'RadialGradientBrush' 형식을 알 수 없습니다. UWP에는 RadialGradientBrush 형식이 없습니다. 태그에서 RadialGradientBrush를 제거하고 다른 형식의 Microsoft DirectX 및 XAML C++ UWP 앱을 사용합니다.
XamlCompiler error WMC0011: '<UIElement type>' 요소의 'OpacityMask' 구성원을 알 수 없습니다. UWP Microsoft DirectX 및 XAML C++ UWP 앱입니다.
'System.Runtime.InteropServices.COMException' 형식의 첫 번째 예외가 SYSTEM.NI.DLL에서 발생했습니다. 추가 정보: 애플리케이션이 다른 스레드를 위해 배열된 인터페이스를 호출했습니다. (예외가 발생한 HRESULT: 0x8001010E(RPC_E_WRONG_THREAD)). 수행하고 있는 작업은 UI 스레드에서 수행해야 합니다. CoreWindow.GetForCurrentThread().Bounds를 호출합니다).
애니메이션이 실행 중이지만, 대상 속성에는 영향을 주지 않습니다. 애니메이션을 독립적으로 만들거나 애니메이션에 EnableDependentAnimation="True"을(를) 설정합니다. 애니메이션을 참조하세요.
Visual Studio에서 Windows 10 프로젝트를 열면, "Visual Studio 업데이트가 필요하다는 메시지가 표시됩니다. 하나 이상의 프로젝트는 설치되지 않았거나 Visual Studio에 대한 향후 업데이트의 일부로 포함된 플랫폼 SDK <버전>을 필요로 합니다." 이 토픽의 TargetPlatformVersion 섹션을 참조하세요.
InitializeComponent가 Xaml.cs 파일에서 호출되면 System.InvalidCastException이 throw됩니다. 이 문제는 동일한 xaml.cs 파일을 공유하는 둘 이상의 xaml 파일(MRT 한정 파일 중 하나 이상)이 있으며 요소에 두 xaml 파일 간에 일치하지 않는 x:Name 특성이 있는 경우에 발생할 수 있습니다. 두 xaml 파일의 동일한 요소에 동일한 이름을 추가하거나 이름을 모두 생략합니다.

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