Ejemplo: control de excepciones al enlazar datos

En el ejemplo siguiente se muestra cómo resolver una excepción MissingMetadataException que se produce cuando una aplicación compilada con la cadena de herramientas .NET Native intenta enlazar datos. Esta es la información de excepción:

This operation cannot be carried out as metadata for the following type was removed for performance reasons:
App.ViewModels.MainPageVM

Esta es la pila de llamadas asociada:

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

¿Qué estaba haciendo la aplicación?

En la base de la pila, los marcos del Windows.UI.Xaml espacio de nombres indican que el motor de representación XAML se estaba ejecutando. El uso del PropertyInfo.GetValue método indica una búsqueda basada en reflexión del valor de una propiedad en el tipo cuyos metadatos se quitaron.

El primer paso para proporcionar una directiva de metadatos sería agregar metadatos serialize para el tipo de forma que sus propiedades sean accesibles:

<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />

¿Es un caso aislado?

En este escenario, si el enlace de datos tiene metadatos incompletos para un ViewModel, es posible que también los tenga para otros. Si el código está estructurado de forma que los modelos de vista de la aplicación estén todos en el App.ViewModels espacio de nombres, podría usar una directiva en tiempo de ejecución más general:

<Namespace Name="App.ViewModels " Serialize="Required Public" />

¿Se podría volver a escribir el código para que no use la reflexión?

Dado que el enlace de datos consume mucha reflexión, el cambio del código para evitar la reflexión no es factible.

Sin embargo, hay formas de especificar el ViewModel en la página XAML para que la cadena de herramientas pueda asociar enlaces de propiedad con el tipo correcto en tiempo de compilación y mantener los metadatos sin usar una directiva en tiempo de ejecución. Por ejemplo, podría aplicar el Windows.UI.Xaml.Data.BindableAttribute atributo en las propiedades. Esto hace que el compilador XAML genere la información de búsqueda necesaria y permite prescindir de una directiva en tiempo de ejecución en el archivo Default.rd.xml.

Vea también