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.
Annotazioni
Questo argomento si riferisce all'anteprima per sviluppatori .NET Native, che è un software non rilasciato. È possibile scaricare l'anteprima dal sito Web di Microsoft Connect (richiede registrazione).
Non tutti gli errori di ricerca dei metadati nelle app sviluppate usando la catena di strumenti .NET Native generano un'eccezione. Alcuni possono manifestarsi in modi imprevedibili in un'app. L'esempio seguente mostra una violazione di accesso causata dal riferimento a un oggetto Null:
Access violation - code c0000005 (first chance)
App!$3_App::Core::Util::NavigationArgs.Setup
App!$3_App::Core::Util::NavigationArgs..ctor
App!$0_App::Gibbon::Util::DesktopNavigationArgs..ctor
App!$0_App::ViewModels::DesktopAppVM.NavigateToPage
App!$3_App::Core::ViewModels::AppViewModel.NavigateToFirstPage
App!$3_App::Core::ViewModels::AppViewModel::<HandleLaunch>d__a.MoveNext
App!$43_System::Runtime::CompilerServices::AsyncMethodBuilderCore.CallMoveNext
App!System::Action.InvokeClosedStaticThunk
App!System::Action.Invoke
App!$43_System::Threading::Tasks::AwaitTaskContinuation.InvokeAction
App!$43_System::Threading::SendOrPostCallback.InvokeOpenStaticThunk
[snip]
Cerchiamo di risolvere l'eccezione utilizzando l'approccio in tre passaggi descritti nella sezione "Risolvere manualmente i metadati mancanti" di Introduzione.
Che cosa stava facendo l'app?
La prima cosa da notare è il async macchinario parola chiave alla base dello stack. Determinare le operazioni effettivamente eseguite dall'app in un metodo async può essere problematico, perché lo stack ha perso il contesto della chiamata di origine ed ha eseguito il codice async in un thread diverso. Tuttavia, è possibile dedurre che l'app sta provando a caricare la prima pagina. Nell'implementazione per NavigationArgs.Setup, il codice seguente ha provocato una violazione di accesso.
AppViewModel.Current.LayoutVM.PageMap
In questa istanza, la proprietà LayoutVM in AppViewModel.Current è stata null. Alcune assenze di metadati hanno causato una sottile differenza di comportamento, risultando in una proprietà non inizializzata invece che impostata, come ci si aspettava dall'app. L'impostazione di un punto di interruzione nel codice in cui LayoutVM dovrebbe essere stata inizializzata potrebbe generare luce sulla situazione. Si noti tuttavia che il tipo di LayoutVMè App.Core.ViewModels.Layout.LayoutApplicationVM. L'unica direttiva di metadati presente finora nel file di rd.xml è:
<Namespace Name="App.ViewModels" Browse="Required Public" Dynamic="Required Public" />
Un possibile motivo del fallimento è la mancanza dei metadati in App.Core.ViewModels.Layout.LayoutApplicationVM perché si trova in uno spazio dei nomi differente.
In questo caso, l'aggiunta di una direttiva di runtime per App.Core.ViewModels ha risolto il problema. La causa principale è stata una chiamata API al metodo Type.GetType(String) che ha restituito nulle l'app ha ignorato silenziosamente il problema fino a quando non si è verificato un arresto anomalo.
Nella programmazione dinamica, è buona norma, quando si utilizzano le API di reflection in .NET Native, impiegare gli overload Type.GetType che lanciano un'eccezione in caso di errore.
È un caso isolato?
Altri problemi possono verificarsi anche quando si usa App.Core.ViewModels. È necessario decidere se è opportuno identificare e correggere ogni eccezione di metadati mancanti o risparmiare tempo e aggiungere direttive per una classe di tipi più ampia. In questo caso, l'aggiunta di metadati dynamic per App.Core.ViewModels potrebbe essere l'approccio migliore se l'aumento delle dimensioni del file binario risultante non è un problema.
È possibile riscrivere il codice?
Se l'app avesse usato typeof(LayoutApplicationVM) invece di Type.GetType("LayoutApplicationVM"), la catena di strumenti avrebbe potuto mantenere i metadati browse. Tuttavia, non sarebbero ancora stati creati i metadati invoke, il che avrebbe portato a un'eccezione MissingMetadataException durante l'instanziazione del tipo. Per evitare l'eccezione, è comunque necessario aggiungere una direttiva di runtime per lo spazio dei nomi o il tipo che specifica la politica dynamic. Per informazioni sulle direttive di runtime, vedere le Direttive runtime (rd.xml) Informazioni di riferimento sui file di configurazione.