Esempio: Risoluzione dei problemi di programmazione dinamicaExample: Troubleshooting Dynamic Programming

Nota

In questo argomento si fa riferimento a .NET Native Developer Preview, ovvero la versione preliminare del software,This topic refers to the .NET Native Developer Preview, which is pre-release software. che è possibile scaricare dal sito Web di Microsoft Connect (è necessaria la registrazione).You can download the preview from the Microsoft Connect website (requires registration).

Non tutti gli errori di ricerca di metadati nelle applicazioni sviluppate usando la catena di strumenti .NET Native.NET Native generano un'eccezione.Not all metadata lookup failures in apps developed using the .NET Native.NET Native tool chain result in an exception. Alcuni possono manifestarsi in maniera imprevista in un'applicazione.Some can manifest in unpredictable ways in an app. Nell'esempio seguente viene illustrata una violazione di accesso causata da riferimento a un oggetto null:The following example shows an access violation caused by referencing a null object:

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]  

Si proverà a risolvere questa eccezione usando l'approccio in tre passaggi descritto nella sezione dedicata alla risoluzione manuale dei metadati mancanti di Getting Started (Introduzione).Let's try to troubleshoot this exception by using the three-step approach outlined in the "Manually resolve missing metadata" section of Getting Started.

Che cosa stava eseguendo l'app?What was the app doing?

La prima cosa da notare è il sistema di parole chiave async alla base dello stack.The first thing to note is the async keyword machinery at the base of the stack. Determinare cosa stesse facendo davvero l'applicazione in un metodo async può risultare problematico, perché lo stack ha perso il contesto di chiamata di origine e ha eseguito il codice async su un thread diverso.Determining what the app was really doing in an async method can be problematic, because the stack has lost the context of the originating call and has run the async code on a different thread. Tuttavia, è possibile dedurre che l'applicazione sta provando a caricare la prima pagina.However, we can deduce that the app is trying to load its first page. Nell'implementazione di NavigationArgs.Setup, il codice seguente ha causato la violazione di accesso:In the implementation for NavigationArgs.Setup, the following code caused the access violation:

AppViewModel.Current.LayoutVM.PageMap  

In questo caso, la proprietà LayoutVM su AppViewModel.Current era null.In this instance, the LayoutVM property on AppViewModel.Current was null. Un'assenza di metadati ha causato una lieve differenza di comportamento e comportato l'annullamento dell'inizializzazione di una proprietà invece della relativa impostazione, come previsto dall'applicazione.Some absence of metadata caused a subtle behavior difference and resulted in a property being uninitialized instead of set, as the app expected. L'impostazione di un punto di interruzione nel codice dove LayoutVM avrebbe dovuto essere inizializzato potrebbe aiutare a fare chiarezza sulla situazione.Setting a breakpoint in the code where LayoutVM should have been initialized might throw light on the situation. Tuttavia, notare che il tipo di LayoutVM è App.Core.ViewModels.Layout.LayoutApplicationVM.However, note that LayoutVM’s type is App.Core.ViewModels.Layout.LayoutApplicationVM. L'unica direttiva di metadati presente finora nel file rd.xml è:The only metadata directive present so far in the rd.xml file is:

<Namespace Name="App.ViewModels" Browse="Required Public" Dynamic="Required Public" />  

Un probabile candidato per l'errore è che i metadati sono assenti in App.Core.ViewModels.Layout.LayoutApplicationVM perché si trova in uno spazio dei nomi differente.A likely candidate for the failure is that App.Core.ViewModels.Layout.LayoutApplicationVM is missing metadata because it's in a different namespace.

In questo caso, l'aggiunta di una direttiva di runtime per App.Core.ViewModels ha risolto il problema.In this case, adding a runtime directive for App.Core.ViewModels resolved the issue. La causa radice è stata una chiamata API al metodo Type.GetType(String) che ha restituito null e l'applicazione ha automaticamente ignorato il problema fino a quando non si è verificato un arresto anomalo del sistema.The root cause was an API call to the Type.GetType(String) method that returned null, and the app silently ignored the problem until a crash occurred.

Nella programmazione dinamica, una buona norma quando si usano le API di reflection sotto .NET Native.NET Native consiste nell'usare gli overload di Type.GetType che generano un'eccezione all'errore.In dynamic programming, a good practice when using reflection APIs under .NET Native.NET Native is to use the Type.GetType overloads that throw an exception on failure.

Si tratta di un caso isolato?Is this an isolated case?

Quando si usa App.Core.ViewModels potrebbero insorgere altri problemi.Other issues might also arise when using App.Core.ViewModels. È necessario decidere se vale la pena identificare e correggere ogni eccezione dei metadati mancanti, oppure risparmiare tempo e aggiungere le direttive per una classe di tipi maggiore.You must decide whether it’s worth identifying and fixing each missing metadata exception, or saving time and adding directives for a larger class of types. In questo caso, l'aggiunta dei metadati dynamic per App.Core.ViewModels potrebbe essere l'approccio migliore se l'aumento delle dimensioni del file binario di output risultante non è un problema.Here, adding dynamic metadata for App.Core.ViewModels might be the best approach if the resulting size increase of the output binary isn’t an issue.

È possibile riscrivere il codice?Could the code be rewritten?

Se l'app aveva usato typeof(LayoutApplicationVM) invece di Type.GetType("LayoutApplicationVM"), la catena di strumenti potrebbe aver preservato i metadati di browse.If the app had used typeof(LayoutApplicationVM) instead of Type.GetType("LayoutApplicationVM"), the tool chain could have preserved browse metadata. I metadati invoke tuttavia non sarebbero stati comunque creati e ciò avrebbe prodotto un'eccezione MissingMetadataException durante la creazione dell'istanza del tipo.However, it still wouldn't have created invoke metadata, which would have led to a MissingMetadataException exception when instantiating the type. Per prevenire l'eccezione, sarebbe comunque necessario aggiungere una direttiva di runtime per lo spazio dei nomi o per il tipo che specifica i criteri dynamic.To prevent the exception, you'd still have to add a runtime directive for the namespace or the type that specifies the dynamic policy. Per informazioni sulle direttive di runtime, vedere Informazioni di riferimento sul file di configurazione delle direttive di runtime (rd.xml).For information on runtime directives, see the Runtime Directives (rd.xml) Configuration File Reference.

Vedere ancheSee Also

IntroduzioneGetting Started
Esempio: Gestione delle eccezioni al momento del data bindingExample: Handling Exceptions When Binding Data