다음을 통해 공유


예: 데이터를 바인딩할 때 예외 처리

다음 예제에서는 .NET Native 도구 체인으로 컴파일된 앱이 데이터를 바인딩하려고 할 때 발생하는 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" />

리플렉션을 사용하지 않도록 코드를 다시 작성할 수 있나요?

데이터 바인딩은 리플렉션을 많이 사용하므로 리플렉션을 방지하기 위해 코드를 변경하는 것은 불가능합니다.

그러나 도구 체인이 컴파일 시간에 속성 바인딩을 올바른 형식과 연결하고 런타임 지시문을 사용하지 않고 메타데이터를 유지할 수 있도록 XAML 페이지에 대한 ViewModel 지정하는 방법이 있습니다. 예를 들어 속성에 Windows.UI.Xaml.Data.BindableAttribute 특성을 적용할 수 있습니다. 이렇게 하면 XAML 컴파일러가 필요한 조회 정보를 생성하고 Default.rd.xml 파일에 런타임 지시문이 필요하지 않습니다.

참고하십시오