ParseException AG_E_PARSER_BAD_TYPE : les points à vérifier

Lors de l'exécution d'une application Silverlight, il arrive parfois de rencontrer une ParseException(“AG_E_PARSER_BAD_TYPE”). Malgré sa description quelque peu crue, le message décrit bel et bien l'erreur rencontrée : un problème de type est survenu lors de la phase de parsing d'un fichier XAML.

J'ai compilé ci-dessous une liste des vérifications que j'utilise pour déterminer la cause de ce type d'exception :

  • Si vous avez récemment renommé un fichier XAML, vérifiez que la valeur de son attribut x:Class correspond bien à sa classe code-behind associée
  • Pour chaque déclaration XAML préfixée d'un namespace, vérifiez que les déclarations xmlns correspondent bien aux assemblies définissant l'objet déclaré
  • Vérifiez que votre projet référence les assemblies utilisées par vos objets déclarés dans le XAML ("Ajouter une référence..."), et que ces assemblies sont belles et biens présentes dans le fichier XAP compilé. Pour explorer le contenu d'un XAP, vous pouvez utiliser votre logiciel d'archivage préféré, ou bien changer son extension en .ZIP et l'explorer. Notez cependant que dans le cas des applications composites, une assembly peut avoir déjà été chargée par un autre module ou le shell.
  • Vérifiez les valeurs des propriétés Copy local des assemblies référencées par vos projets, afin de s'assurez vous que chaque assembly est chargée par au moins un projet lors de l'exécution
  • Si vous utilisez Prism, faire que votre shell référence les assemblies dont vos modules dépendent peut résoudre le problème, c'est d'ailleurs une façon populaire de résoudre le problème si vous utilisez le Silverlight Toolkit. Bien que référencer toutes les dépendances directement depuis le shell aille à l'encontre même de la philosophie composite, référencer les assemblies de contrôles utilisateurs est en général une bonne idée.
  • En dernier recours, vous pouvez utiliser l'astuce de David Yack : forcer une instanciation du type récalcitrant dans le constructeur, avant même d'appeler la méthode InitializeComponent()

Comme vous avez pu le constater, cette exception est en général causée par un problème de résolution de type: assurez-vous donc que les assemblies référencées par le XAML sont bien accessibles.