Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Následující příklad ukazuje, jak vyřešit MissingMetadataException výjimku, která se vyvolá, když se aplikace zkompilovaná pomocí řetězce nástrojů .NET Native pokusí svázat data. Tady jsou informace o výjimce:
This operation cannot be carried out as metadata for the following type was removed for performance reasons:
App.ViewModels.MainPageVM
Zde je přidružený zásobník volání:
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
Co aplikace dělala?
Na spodku zásobníku rámec z oboru názvů Windows.UI.Xaml naznačuje, že vykreslovací modul XAML běží. Použití metody PropertyInfo.GetValue označuje na reflexi založené vyhledávání hodnoty vlastnosti u typu, jehož metadata byla odstraněna.
Prvním krokem při poskytování direktivy metadat by bylo přidání serialize
metadat pro typ tak, aby byly všechny jeho vlastnosti přístupné:
<Type Name="App.ViewModels.MainPageVM" Serialize="Required Public" />
Jedná se o izolovaný případ?
V tomto scénáři platí, že pokud datová vazba obsahuje neúplná metadata pro jednu ViewModel
, může to být i pro ostatní. Pokud je kód strukturovaný tak, aby modely zobrazení aplikace byly všechny v oboru názvů App.ViewModels
, můžete použít obecnější direktivu modulu runtime:
<Namespace Name="App.ViewModels " Serialize="Required Public" />
Je možné přepsat kód tak, aby nepoužít reflexi?
Vzhledem k tomu, že datová vazba je náročná na reflexi, není změna kódu, aby se zabránilo reflexi, proveditelná.
Existují však způsoby, jak zadat ViewModel
na stránku XAML, aby řetěz nástrojů mohl přidružit vazby vlastností ke správnému typu v době kompilace a zachovat metadata bez použití direktivy modulu runtime. Můžete například použít atribut Windows.UI.Xaml.Data.BindableAttribute u vlastností. To způsobí, že kompilátor XAML vygeneruje požadované vyhledávací informace a vyhne se vyžadování direktivy runtime v souboru Default.rd.xml.