비고
이 항목에서는 시험판 소프트웨어인 .NET 네이티브 개발자 미리 보기를 참조합니다. Microsoft Connect 웹사이트 에서 미리 보기를 다운로드할 수 있습니다 (등록 필요).
.NET 네이티브 도구 체인을 사용하여 개발된 앱의 모든 메타데이터 조회 실패로 인해 예외가 발생하는 것은 아닙니다. 일부는 앱에서 예측할 수 없는 방식으로 매니페스트할 수 있습니다. 다음 예제에서는 null 개체를 참조하여 발생한 액세스 위반을 보여 드립니다.
Access violation - code c0000005 (first chance)
App!$3_App::Core::Util::NavigationArgs.Setup
App!$3_App::Core::Util::NavigationArgs..ctor
App!$0_App::Gibbon::Util::DesktopNavigationArgs..ctor
App!$0_App::ViewModels::DesktopAppVM.NavigateToPage
App!$3_App::Core::ViewModels::AppViewModel.NavigateToFirstPage
App!$3_App::Core::ViewModels::AppViewModel::<HandleLaunch>d__a.MoveNext
App!$43_System::Runtime::CompilerServices::AsyncMethodBuilderCore.CallMoveNext
App!System::Action.InvokeClosedStaticThunk
App!System::Action.Invoke
App!$43_System::Threading::Tasks::AwaitTaskContinuation.InvokeAction
App!$43_System::Threading::SendOrPostCallback.InvokeOpenStaticThunk
[snip]
시작하기"누락된 메타데이터 수동 해결" 섹션에 설명된 세 가지 단계 접근법을 사용하여 이 예외를 해결해 보겠습니다.
앱은 무엇을 하고 있나요?
가장 먼저 유의해야 할 점은 스택의 밑부분에 있는 async 키워드 장치입니다. 스택이 원래 호출의 컨텍스트를 잃고 다른 스레드에서 코드를 실행 async 했기 때문에 앱이 메서드에서 async 실제로 수행하는 작업을 결정하는 것은 문제가 될 수 있습니다. 그러나 앱이 첫 번째 페이지를 로드하려고 한다고 추론할 수 있습니다. 구현 NavigationArgs.Setup에서 다음 코드로 인해 액세스 위반이 발생했습니다.
AppViewModel.Current.LayoutVM.PageMap
이 경우, LayoutVM의 AppViewModel.Current 속성은 null 입니다. 일부 메타데이터가 없어서 약간의 동작 차이가 발생하였고, 그로 인해 속성이 앱이 예상한 대로 설정되지 못하고 초기화되어 있지 않은 상태로 남아 있었습니다.
LayoutVM이(가) 초기화되어야 하는 코드에 중단점을 설정하면 상황을 이해하는 데 도움이 될 수 있습니다. 그러나 LayoutVM의 유형이 App.Core.ViewModels.Layout.LayoutApplicationVM임을 유의하십시오. 지금까지 rd.xml 파일에 있는 유일한 메타데이터 지시문은 다음과 같습니다.
<Namespace Name="App.ViewModels" Browse="Required Public" Dynamic="Required Public" />
실패의 유력한 원인은 App.Core.ViewModels.Layout.LayoutApplicationVM가 다른 네임스페이스에 있어서 메타데이터가 누락된 것입니다.
이 경우 문제를 해결하기 위한 App.Core.ViewModels 런타임 지시문을 추가합니다. 근본 원인은 Type.GetType(String) 메서드에 대한 API 호출로, 이 호출이 null을(를) 반환하여 앱이 해당 문제를 조용히 무시하고 있다가 충돌이 발생했습니다.
동적 프로그래밍에서 .NET 네이티브의 리플렉션 API를 사용할 때, 오류가 발생하면 예외를 throw하는 Type.GetType 오버로드를 사용하는 것이 좋은 방법입니다.
격리된 사례인가요?
를 사용할 App.Core.ViewModels때 다른 문제도 발생할 수 있습니다. 누락된 각 메타데이터 예외를 식별하고 수정할 가치가 있는지, 아니면 더 큰 형식 클래스에 대한 지시문을 추가하고 시간을 절약할 것인지 결정해야 합니다. 여기서 출력 이진 파일의 결과 크기 증가가 문제가 되지 않는 경우 dynamic 대한 App.Core.ViewModels 메타데이터를 추가하는 것이 가장 좋은 방법일 수 있습니다.
코드를 다시 작성할 수 있나요?
앱이 typeof(LayoutApplicationVM) 대신 Type.GetType("LayoutApplicationVM")를 사용했더라면, 도구 체인이 browse 메타데이터를 보존할 수 있었을 겁니다. 그러나 여전히 메타데이터를 만들지 invoke 않았으므로 형식을 인스턴스화할 때 MissingMetadataException 예외가 발생했습니다. 예외를 방지하려면 네임스페이스 또는 정책을 지정하는 형식에 대한 런타임 지시문을 추가해야 합니다 dynamic . 런타임 지시문에 대한 정보는 런타임 지시문(rd.xml) 구성 파일 참조를 참조하세요.