Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'esempio seguente illustra come risolvere un'eccezione MissingMetadataException generata quando un'app compilata con la catena di strumenti .NET Native tenta di associare i dati. Ecco le informazioni sull'eccezione:
This operation cannot be carried out as metadata for the following type was removed for performance reasons:
App.ViewModels.MainPageVM
Ecco lo stack di chiamate associato:
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
Che cosa stava facendo l'app?
Alla base dello stack, i frame dello spazio dei nomi Windows.UI.Xaml indicano che il motore di rendering XAML era in esecuzione. L'uso del metodo PropertyInfo.GetValue indica una ricerca basata sulla reflection del valore di una proprietà del tipo i cui metadati sono stati rimossi.
Il primo passaggio per fornire una direttiva di metadati consiste nell'aggiungere metadati serialize per il tipo in modo che le relative proprietà siano tutte accessibili:
<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />
È un caso isolato?
In questo scenario, se il data binding ha metadati incompleti per un ViewModel, potrebbe averli anche per altri. Se il codice è strutturato in modo che i modelli di visualizzazione dell'app siano tutti nello spazio dei nomi App.ViewModels, è possibile usare una direttiva di runtime più generale:
<Namespace Name="App.ViewModels " Serialize="Required Public" />
È possibile riscrivere il codice senza usare la reflection?
Poiché il data binding è a elevato utilizzo di reflection, la modifica del codice per evitare la reflection non è fattibile.
Esistono tuttavia modi per specificare il ViewModel alla pagina XAML in modo che la catena di strumenti possa associare associazioni di proprietà al tipo corretto in fase di compilazione e mantenere i metadati senza usare una direttiva di runtime. Ad esempio, è possibile applicare l'attributo Windows.UI.Xaml.Data.BindableAttribute alle proprietà. In questo modo il compilatore XAML genera le informazioni di ricerca necessarie ed evita di richiedere una direttiva di runtime nel file Default.rd.xml.