Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Remarque
Cette rubrique fait référence à la préversion du développeur .NET Native, qui est un logiciel préversion. Vous pouvez télécharger la préversion à partir du site web Microsoft Connect (nécessite l’inscription).
Toutes les défaillances de recherche de métadonnées dans les applications développées à l’aide de la chaîne d’outils .NET Native n’entraînent pas d’exception. Certains peuvent se manifester de manière imprévisible dans une application. L’exemple suivant montre une violation d’accès provoquée par le référencement d’un objet 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]
Essayons de résoudre cette exception à l’aide de l’approche en trois étapes décrite dans la section « Résoudre manuellement les métadonnées manquantes » de La prise en main.
Que faisait l’application ?
La première chose à noter est le mécanisme de mots-clés async à la base de la pile. Déterminer ce que l’application faisait réellement dans une async méthode peut être problématique, car la pile a perdu le contexte de l’appel d’origine et a exécuté le async code sur un autre thread. Toutefois, nous pouvons déduire que l’application tente de charger sa première page. Dans l’implémentation pour NavigationArgs.Setup, le code suivant a provoqué la violation d’accès :
AppViewModel.Current.LayoutVM.PageMap
Dans cet exemple, la propriété LayoutVM sur AppViewModel.Current était null . Certaines absences de métadonnées ont provoqué une différence de comportement subtile et ont entraîné une propriété non initialisée au lieu d’être définie, comme prévu par l’application. Définir un point d'arrêt dans le code là où LayoutVM aurait dû être initialisé pourrait éclairer la situation. Toutefois, notez que le type de LayoutVMest App.Core.ViewModels.Layout.LayoutApplicationVM. La seule directive de métadonnées présente jusqu’à présent dans le fichier rd.xml est la suivante :
<Namespace Name="App.ViewModels" Browse="Required Public" Dynamic="Required Public" />
Un candidat probable pour l’échec est le manque de métadonnées dans App.Core.ViewModels.Layout.LayoutApplicationVM, car il se trouve dans un espace de noms différent.
Dans ce cas, l’ajout d’une directive d'exécution pour App.Core.ViewModels a résolu le problème. La cause racine était un appel d’API à la Type.GetType(String) méthode qui a retourné null, et l’application a ignoré silencieusement le problème jusqu’à ce qu’un incident se soit produit.
Dans le cadre de la programmation dynamique, il est conseillé, lors de l'utilisation des API de réflexion avec .NET Native, d'employer les surcharges Type.GetType qui lèvent une exception en cas d'échec.
Est-ce un cas isolé ?
D’autres problèmes peuvent également survenir lors de l’utilisation App.Core.ViewModels. Vous devez décider s’il vaut la peine d’identifier et de corriger chaque exception de métadonnées manquante, ou d’économiser du temps et d’ajouter des directives pour une plus grande classe de types. Ici, ajouter les métadonnées dynamic pour App.Core.ViewModels peut être la meilleure approche si l'augmentation de la taille résultante du binaire de sortie ne pose pas de problème.
Le code peut-il être réécrit ?
Si l’application avait utilisé typeof(LayoutApplicationVM) au lieu de Type.GetType("LayoutApplicationVM"), la chaîne d’outils aurait pu conserver les métadonnées browse. Toutefois, il n’aurait toujours pas créé invoke de métadonnées, ce qui aurait conduit à une exception MissingMetadataException lors de l’instanciation du type. Pour empêcher l’exception, vous devrez quand même ajouter une directive d'exécution pour l’espace de noms ou le type qui spécifie la stratégie dynamic. Pour plus d'informations sur les directives d'exécution , consultez la référence du fichier de configuration (rd.xml).