Exemplo: lidando com exceções ao associar dados
O exemplo a seguir mostra como resolver uma exceção MissingMetadataException que é gerada quando um aplicativo compilado com a cadeia de ferramentas do .NET Native tenta associar dados. Aqui estão as informações de exceção:
This operation cannot be carried out as metadata for the following type was removed for performance reasons:
App.ViewModels.MainPageVM
Esta é a pilha de chamadas associadas:
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
O que o aplicativo estava fazendo?
Na base da pilha, os quadros do Windows.UI.Xaml namespace indicam que o mecanismo de renderização XAML estava em execução. O uso do PropertyInfo.GetValue método indica uma pesquisa baseada em reflexão do valor de uma propriedade no tipo cujos metadados foram removidos.
A primeira etapa no fornecimento de uma diretiva de metadados seria adicionar metadados serialize
ao tipo de forma que suas propriedades estejam acessíveis:
<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />
Esta é uma ocorrência isolada?
Neste cenário, se a associação dos dados possuem metadados incompletos para um ViewModel
, isso também pode ocorrer para outros. Se o código for estruturado de forma que os modelos de exibição do aplicativo estejam todos no App.ViewModels
namespace, você poderá usar uma diretiva de runtime mais geral:
<Namespace Name="App.ViewModels " Serialize="Required Public" />
O código pode ser reconfigurado para não usar reflexão?
Como a associação de dados exige muita reflexão, não é viável alterar o código para evitar a reflexão.
No entanto, existem maneiras para especificar o ViewModel
para a página XAML para que a cadeia de ferramentas possa associar propriedades de vinculação com o tipo correto no tempo de compilação e manter os metadados sem usar uma diretiva de runtime. Por exemplo, você pode aplicar o Windows.UI.Xaml.Data.BindableAttribute atributo em propriedades. Isso faz com que o compilador XAML gere informações de pesquisa necessárias e evita que necessitem de uma diretiva de runtime no arquivo Default.rd.xml.