Partilhar via


Exemplo: Manipulando exceções ao vincular dados

O exemplo a seguir mostra como resolver uma exceção MissingMetadataException que é lançada quando um aplicativo compilado com a cadeia de ferramentas .NET Native tenta vincular 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

Aqui está a pilha de chamadas associada:

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, quadros do namespace Windows.UI.Xaml indicam que o mecanismo de renderização XAML estava em execução. O uso do método PropertyInfo.GetValue indica uma pesquisa por reflexão do valor de uma propriedade no tipo cujos metadados foram removidos.

A primeira etapa para fornecer uma diretiva de metadados seria adicionar serialize metadados para o tipo para que suas propriedades sejam todas acessíveis:

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

Trata-se de um caso isolado?

Nesse cenário, se a associação de dados tiver metadados incompletos para um ViewModel, poderá também sê-lo para outros. Se o código estiver estruturado de forma que os modelos de exibição do aplicativo estejam todos no App.ViewModels namespace, você poderá usar uma diretiva de tempo de execução mais geral:

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

O código poderia ser reescrito para não usar reflexão?

Como a vinculação de dados exige muita reflexão, alterar o código para evitar reflexão não é viável.

No entanto, há maneiras de especificar o ViewModel na página XAML para que a cadeia de ferramentas possa associar ligações de propriedades ao tipo correto em tempo de compilação e manter os metadados sem necessidade de usar uma diretiva durante a execução. Por exemplo, você pode aplicar o Windows.UI.Xaml.Data.BindableAttribute atributo em propriedades. Isso faz com que o compilador XAML gere as informações de pesquisa necessárias e evita a necessidade de uma diretiva de tempo de execução no arquivo Default.rd.xml.

Ver também