Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
I följande exempel visas hur du löser ett MissingMetadataException undantag som utlöses när en app som kompileras med .NET Native-verktygskedjan försöker binda data. Här är undantagsinformationen:
This operation cannot be carried out as metadata for the following type was removed for performance reasons:
App.ViewModels.MainPageVM
Här är den associerade anropsstacken:
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
Vad gjorde appen?
Vid basen av stacken anger ramar från Windows.UI.Xaml-namnområdet att XAML-återgivningsmotorn kördes. Användningen av metoden PropertyInfo.GetValue anger en reflektionsbaserad sökning av en egenskaps värde på den typ vars metadata har tagits bort.
Det första steget i att tillhandahålla ett metadatadirektiv är att lägga till serialize metadata för typen så att alla dess egenskaper är tillgängliga:
<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />
Är det här ett isolerat fall?
Om databindningen i det här scenariot har ofullständiga metadata för en ViewModel, kan samma sak gälla även för andra. Om koden är strukturerad på ett sätt som gör att appens vymodeller finns i App.ViewModels namnrymd kan du använda ett mer allmänt körningsdirektiv:
<Namespace Name="App.ViewModels " Serialize="Required Public" />
Kan koden skrivas om för att inte använda reflektion?
Eftersom databindningen är reflektionsintensiv är det inte möjligt att ändra koden för att undvika reflektion.
Det finns dock sätt att ange ViewModel till XAML-sidan så att verktygskedjan kan associera egenskapsbindningar med rätt typ vid kompileringstid och behålla metadata utan att använda ett körningsdirektiv. Du kan till exempel använda attributet Windows.UI.Xaml.Data.BindableAttribute på egenskaper. Detta gör att XAML-kompilatorn genererar nödvändig uppslagsinformation och undviker att kräva ett körningsdirektiv i Default.rd.xml-filen.