Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Das folgende Beispiel zeigt, wie Sie eine Ausnahme vom Typ MissingMetadataException beheben können, die ausgelöst wird, wenn eine App, die mit der .NET Native-Werkzeugkette kompiliert wurde, eine Datenbindung versucht. 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 der zugehörige Aufrufstapel:
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?
Am unteren Ende des Stapels zeigen Frames aus dem Namensraum Windows.UI.Xaml an, dass die XAML-Rendering-Engine ausgeführt wurde. Die Verwendung der PropertyInfo.GetValue-Methode kennzeichnet einen reflektionsbasierten Nachschlagevorgang des Werts einer Eigenschaft für den Typ, dessen Metadaten entfernt wurden.
Der erste Schritt bei der Bereitstellung einer Metadatendirektive wäre das Hinzufügen serialize Metadaten für den Typ, sodass alle zugehörigen Eigenschaften zugänglich sind:
<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />
Ist dies ein Isolierter Fall?
Wenn die Datenbindung in diesem Szenario unvollständige Metadaten für einen ViewModelhat, kann dies auch bei anderen der Fall sein. 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 neu geschrieben werden, um die Spiegelung nicht zu verwenden?
Da die Datenbindung reflektionsintensiv ist, ist das Ändern des Codes zur Vermeidung der Spiegelung nicht machbar.
Es gibt jedoch Möglichkeiten, die ViewModel der XAML-Seite anzugeben, damit die Toolkette Eigenschaftenbindungen dem richtigen Typ zur Kompilierungszeit zuordnen und die Metadaten beibehalten kann, ohne eine Laufzeitdirektive zu verwenden. Beispielsweise können Sie das Windows.UI.Xaml.Data.BindableAttribute Attribut auf Eigenschaften anwenden. Dadurch generiert der XAML-Compiler die erforderlichen Nachschlageinformationen und verhindert, dass eine Laufzeitdirektive in der Default.rd.xml Datei erforderlich ist.