예: 데이터를 바인딩하는 경우 예외 처리
다음 예제에서는 .NET 네이티브 도구 체인을 사용하여 컴파일한 앱이 데이터 바인딩을 시도하면 throw되는 MissingMetadataException 예외를 해결하는 방법을 보여 줍니다. 예외 정보는 다음과 같습니다.
This operation cannot be carried out as metadata for the following type was removed for performance reasons:
App.ViewModels.MainPageVM
관련 호출 스택은 다음과 같습니다.
Reflection::Execution::ReflectionDomainSetupImplementation.CreateNonInvokabilityException+0x238
Reflection::Core::ReflectionDomain.CreateNonInvokabilityException+0x2e
Reflection::Core::Execution::ExecutionEnvironment.+0x316
System::Reflection::Runtime::PropertyInfos::RuntimePropertyInfo.GetValue+0x1cb
System::Reflection::PropertyInfo.GetValue+0x22
System::Runtime::InteropServices::WindowsRuntime::CustomPropertyImpl.GetValue+0x42
App!$66_Interop::McgNative.Func_IInspectable_IInspectable+0x158
App!$66_Interop::McgNative::__vtable_Windows_UI_Xaml_Data__ICustomProperty.GetValue__STUB+0x46
Windows_UI_Xaml!DirectUI::PropertyProviderPropertyAccess::GetValue+0x3f
Windows_UI_Xaml!DirectUI::PropertyAccessPathStep::GetValue+0x31
Windows_UI_Xaml!DirectUI::PropertyPathListener::ConnectPathStep+0x113
앱이 어떤 작업을 수행 중이었나요?
스택의 밑에서 Windows.UI.Xaml 네임스페이스의 프레임은 XAML 렌더링 엔진이 실행 중임을 나타냅니다. PropertyInfo.GetValue 메서드를 사용하는 것은 메타데이터가 제거된 유형에 대한 속성 값의 리플렉션 기반 조회를 나타냅니다.
메타데이터 지시문을 제공하는 첫 단계에서는 모든 속성에 액세스할 수 있도록 형식에 대해 serialize
메타데이터를 추가합니다.
<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />
사례의 격리 여부 확인
이 시나리오에서는 데이터 바인딩에서 ViewModel
하나의 메타데이터가 불완전하면 나머지 항목의 메타데이터도 불완전할 수 있습니다. 앱의 뷰 모델이 모두 App.ViewModels
네임스페이스에 포함되는 방식으로 코드를 작성한 경우에는 보다 일반적인 런타임 지시문을 사용할 수 있습니다.
<Namespace Name="App.ViewModels " Serialize="Required Public" />
리플렉션을 사용하지 않도록 코드 다시 작성 가능 여부 확인
데이터 바인딩에서는 리플렉션을 많이 사용하므로 리플렉션을 사용하지 않도록 코드를 변경하기는 어렵습니다.
그러나 ViewModel
을 XAML 페이지로 지정하여 도구 체인이 컴파일 타임에 속성 바인딩을 올바른 형식과 연결하고, 런타임 지시문을 사용하지 않고 메타데이터를 유지하도록 할 수는 있습니다. 예를 들어 속성에 Windows.UI.Xaml.Data.BindableAttribute 특성을 적용할 수 있습니다. 이렇게 하면 XAML 컴파일러가 필요한 조회 정보를 생성하고 Default.rd.xml 파일에서 런타임 지시문이 필요하도록 설정하지 않습니다.