Exemple : gestion des exceptions pendant la liaison de données
L’exemple suivant montre comment résoudre une exception MissingMetadataException levée lorsqu’une application compilée avec la chaîne d’outils .NET Native tente de lier des données. Voici les informations d’exception :
This operation cannot be carried out as metadata for the following type was removed for performance reasons:
App.ViewModels.MainPageVM
Voici la pile des appels associée :
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
Que faisait l’application ?
À la base de la pile, les images de l’espace Windows.UI.Xaml de noms indiquent que le moteur de rendu XAML était en cours d’exécution. L’utilisation de la PropertyInfo.GetValue méthode indique une recherche basée sur la réflexion de la valeur d’une propriété sur le type dont les métadonnées ont été supprimées.
La première étape pour fournir une directive de métadonnées consisterait à ajouter des métadonnées serialize
pour le type afin que ses propriétés soient toutes accessibles :
<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />
S'agit-il d'un cas isolé ?
Dans ce scénario, si la liaison de données contient des métadonnées incomplètes pour un ViewModel
, cela peut également être le cas pour d'autres. Si le code est structuré de manière à ce que les modèles d’affichage de l’application soient tous dans l’espace App.ViewModels
de noms, vous pouvez utiliser une directive d’exécution plus générale :
<Namespace Name="App.ViewModels " Serialize="Required Public" />
Le code peut-il être réécrit de manière à ne pas utiliser la réflexion ?
Étant donné que la liaison de données est gourmande en réflexion, la modification du code pour éviter la réflexion n’est pas réalisable.
Toutefois, certains procédés permettent de spécifier le ViewModel
pour la page XAML afin que la chaîne d'outils associe les liaisons de propriété au type approprié au moment de la compilation et conserve les métadonnées sans utiliser de directive runtime. Par exemple, vous pouvez appliquer l’attribut sur les Windows.UI.Xaml.Data.BindableAttribute propriétés. Ainsi, le compilateur XAML génère les informations de recherche nécessaires et évite la présence d'une directive runtime dans le fichier Default.rd.xml.