Beispiel: Behandeln von Ausnahmen beim Binden von Daten
Das folgende Beispiel zeigt, wie Eine MissingMetadataException-Ausnahme aufgelöst wird, die ausgelöst wird, wenn eine App, die mit der .NET Native-Toolkette kompiliert wurde, versucht, Daten zu binden. Hier sind die Ausnahmeinformationen:
This operation cannot be carried out as metadata for the following type was removed for performance reasons:
App.ViewModels.MainPageVM
Hier ist die zugehörige Aufrufliste:
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
Was hat die App getan?
Auf der Basis des Stapels geben Frames aus dem Windows.UI.Xaml Namespace an, dass das XAML-Renderingmodul ausgeführt wurde. Die Verwendung der PropertyInfo.GetValue Methode gibt einen spiegelungsbasierten Nachschlagevorgang des Werts einer Eigenschaft für den Typ an, dessen Metadaten entfernt wurden.
Der erste Schritt beim Bereitstellen einer Metadatendirektive wäre, serialize
-Metadaten für den Typ hinzuzufügen, damit auf alle seine Eigenschaften zugegriffen werden kann:
<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />
Handelt es sich um einen Einzelfall?
Wenn die Datenbindung in diesem Szenario unvollständige Metadaten für ein ViewModel
aufweist, kann dies auch für andere gelten. Wenn der Code so strukturiert ist, dass sich die Ansichtsmodelle der App im App.ViewModels
Namespace befinden, können Sie eine allgemeinere Laufzeitdirektive verwenden:
<Namespace Name="App.ViewModels " Serialize="Required Public" />
Könnte der Code so umgeschrieben werden, dass keine Reflektion verwendet wird?
Da die Datenbindung reflektionsintensiv ist, ist das Ändern des Codes zur Vermeidung der Spiegelung nicht machbar.
Es gibt jedoch Möglichkeiten zum Angeben des ViewModel
auf der XAML-Seite, damit die Toolkette Eigenschaftenbindungen zur Kompilierungszeit den korrekten Typ zuordnen und die Metadaten ohne Verwendung einer Laufzeitanweisung beibehalten kann. Beispielsweise können Sie das Windows.UI.Xaml.Data.BindableAttribute Attribut auf Eigenschaften anwenden. Dies bewirkt, dass der XAML-Compiler die erforderlichen Nachschlageinformationen generiert, und vermeidet die Erfordernis einer Laufzeitanweisung in der Datei Default.rd.xml.