L’application .NET ne peut pas démarrer et recevoir XamlParseException

J’ai écrit une application qui peut installer et travailler sur mon PC de développement (Windows 7).

  • Environnement de développement: Windows 7, VS2010 WPF C # avec .NET 4 et .NET 3.5 installés

Sur un autre ordinateur client (XP SP3, 2 et 1), il s’installe sans erreur, mais ne peut pas démarrer. Dans le gestionnaire de tâches, je peux voir que l’application occupe brièvement la mémoire avant de se fermer d’elle-même.

Je m’étais assuré de la cohérence .NET 3.5 sur mon PC de développement et sur diverses machines client XP en procédant comme suit:

  • L’application cible .NET 3.5 (ou 3.5 Client Profile )
  • Utilisez le programme d’installation VS2010 pour le déploiement: cible .NET 3.5 dans la condition de lancement
  • Aucune erreur concernant la compatibilité .NET lors du débogage de l’application et du projet d’installation

eventvwr a détecté l’avertissement suivant:

¬º˛¿‡–Õ: ¥ÌŒÛ  ¬º˛¿¥'¥: .NET Runtime  ¬º˛÷÷¿‡: Œfi  ¬º˛ ID: 1026 »'∆⁄: 2011-10-18  ¬º˛: 15:18:32 ”√ªß: N/A º∆À„ª˙: WWW-9DB69D5A3AF √Ë ˆ: Application: Foo.exe Framework Version: v4.0.30319 Description: ”…”⁄Œ¥æ≠¥¶¿Ìµƒ“Ï≥££¨Ω¯≥Ã÷'÷π°£ “Ï≥£–≈œ¢: System.Windows.Markup.XamlParseException ∂—'ª: '⁄ System.Windows.Markup.XamlReader.RewrapException(System.Exception, System.Xaml.IXamlLineInfo, System.Uri) '⁄ System.Windows.Markup.WpfXamlLoader.Load(System.Xaml.XamlReader, System.Xaml.IXamlObjectWriterFactory, Boolean, System.Object, System.Xaml.XamlObjectWriterSettings, System.Uri) '⁄ System.Windows.Markup.WpfXamlLoader.LoadBaml(System.Xaml.XamlReader, Boolean, System.Object, System.Xaml.Permissions.XamlAccessLevel, System.Uri) '⁄ System.Windows.Markup.XamlReader.LoadBaml(System.IO.Stream, System.Windows.Markup.ParserContext, System.Object, Boolean) '⁄ System.Windows.Application.LoadBamlStreamWithSyncInfo(System.IO.Stream, System.Windows.Markup.ParserContext) '⁄ System.Windows.Application.LoadComponent(System.Uri, Boolean) '⁄ System.Windows.Application.DoStartup() '⁄ System.Windows.Application.b__1(System.Object) '⁄ System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32) '⁄ MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate) '⁄ System.Windows.Threading.DispatcherOperation.InvokeImpl() '⁄ System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object) '⁄ System.Threading.ExecutionContext.runTryCode(System.Object) '⁄ System.Runtime.ComstackrServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object) '⁄ System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) '⁄ System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) '⁄ System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) '⁄ System.Windows.Threading.DispatcherOperation.Invoke() '⁄ System.Windows.Threading.Dispatcher.ProcessQueue() '⁄ System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) '⁄ MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) '⁄ MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object) '⁄ System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32) '⁄ MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate) '⁄ System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32) '⁄ MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr) '⁄ MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef) '⁄ System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame) '⁄ System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame) '⁄ System.Windows.Threading.Dispatcher.Run() '⁄ System.Windows.Application.RunDispatcher(System.Object) '⁄ System.Windows.Application.RunInternal(System.Windows.Window) '⁄ System.Windows.Application.Run(System.Windows.Window) '⁄ System.Windows.Application.Run() '⁄ FooSoftware.App.Main() ”–πÿ∏¸∂‡–≈œ¢£¨«Î≤Œ'ƒ'⁄ http://go.microsoft.com/fwlink/events.asp µƒ∞Ô÷˙∫Õ÷ß≥÷÷––ƒ°£ 

il y avait cette XamlParseException empêchant mon application de démarrer sur XP Window Machine. Que se passe-t-il?

XamlParseException est l’erreur générique qui se produit lorsqu’il y a un problème au démarrage de l’application. Je vous suggère de modifier le code de démarrage de votre application pour déterminer ce qui se passe réellement et obtenir non seulement l’exception XamlParseException, mais également la ou les exceptions internes qui devraient vous aider à déterminer la source du problème. Voici un exemple:

 namespace WpfApplication1 { ///  /// Interaction logic for App.xaml ///  public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { // hook on error before app really starts AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); base.OnStartup(e); } void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { // put your tracing or logging code here (I put a message box as an example) MessageBox.Show(e.ExceptionObject.ToSsortingng()); } } } 

Pour commencer, vous auriez plus de chance si vous utilisiez VS2010 .. mais que vous visiez une version plus basse de .Net (3.5, voire 2.0).

Ce serait certainement utile si vous postez un peu de code.

Assurez-vous d’avoir copié tous les fichiers nécessaires à votre application (app.config, etc.).

Ce lien semble similaire:

Le programme .NET 4 écrit / compilé sur une machine Windows 7 ne fonctionnera pas sous XP

Et il pointe vers ces excellents conseils de dépannage:

Utilisation de Fusion Log Viewer

Vous pouvez déboguer à distance. Pour ce faire, vous devez installer le serveur de débogage distant sur la machine cible, puis l’y attacher à partir de votre visual studio lorsque vous démarrez l’application. Quelques informations supplémentaires peuvent être trouvées ici: http://msdn.microsoft.com/en-us/library/bt727f1t.aspx et il y a un tutoriel quelque peu âgé ici: http://www.cprogramming.com/tutorial/visual_studio_remote_debugging.html

Veuillez noter que vous devez déployer avec les symboles de débogage (pdbs) et que le logiciel débogué doit avoir la même version que votre code.

Bien que vous vouliez cibler .NET 3.5, votre client a installé et utilisé NET. 4. La ficelle

 Framework Version: v4.0.30319 

me dit ça. Pour forcer votre client à utiliser .NET 3.5, vous devez append un App.config à votre application et append:

      

Il se peut que vous obteniez une exception car .NET 4 traite votre XAML de manière différente. Avez-vous essayé de laisser votre application s’exécuter sous .NET 4? Si vous n’avez pas fourni App.config, vous avez quand même testé votre application avec .NET Framework 4 bien que vous ayez ciblé .NET Framework 3.5. Si votre client est assez gentil, vous pouvez le laisser créer un fichier de vidage afin de pouvoir le déboguer facilement. Téléchargez Procdump à partir de la suite d’outils SysInternals et envoyez-le avec votre application à votre client. Le laisser exécuter

 procdump -ma -e -t -x foo.exe %temp%\dump.dmp 

Cela générera un vidage complet du processus pour chaque exception non gérée et une autre lorsque le processus se terminera dans le répertoire% TEMP%. Visual Studio 2010 dispose désormais d’un meilleur support d’parsing de vidage. Vous devriez donc pouvoir l’parsingr dans Visual Studio 2010. Si cela ne vous aide pas, vous pouvez télécharger Windbg (32 bits ici ), charger le dump et taper

! parsingr -v

pour voir quelle était la dernière exception. Cela devrait faire l’affaire. Il peut y avoir des problèmes avec les extensions gérées pour charger la bonne DLL de débogage (sos.dll pour .NET 2,3,3.5 et clr.dll pour .NET 4), mais de nombreux didacticiels en ligne expliquent comment le faire. En plus de cela, je recommanderais d’append des gestionnaires d’exception dans votre application afin que vous obteniez un bon fichier journal lorsque votre application se termine de manière inattendue.

Si la sortie ne mène pas à la bonne stack, vous devez utiliser! ClrStack et! Threads pour savoir quels threads ont des exceptions sur leur stack.

Habituellement, je mets des fichiers journaux entre les processus pour que je connaisse le déroulement de mon programme.

S’il s’agit d’une application console, insérez Console.WriteLine (une chaîne), puis Console.ReadLine () à la fin pour suspendre l’exécution de votre programme.

Je suis récemment tombé sur un problème similaire. Le problème que j’ai eu est sur Windows 7, j’utilisais .ico (fichiers d’icône). Mais il n’y a pas de support pour cela sur XP. Dans votre application, si vous utilisez des fichiers d’icons, essayez de les supprimer. Vérifiez si cela résout le problème.

Commencez à commenter des lignes de code et des classes / méthodes entières de votre code jusqu’à ce que vous obteniez son fonctionnement (ou commencez par tout commenter). Puis commencez lentement à introduire des lignes de code et des appels de méthode, etc. Cela devrait vous donner une idée de tout code / classe ou référence en particulier à l’origine du problème. C’est certes une méthode fastidieuse, mais en même temps assez mécanique et au bout d’une heure environ, vous devriez avoir une assez bonne idée du coupable.

J’ai entendu dire que certains codes commentés affectés sur l’exécution du fichier de sortie avaient un comportement similaire à celui survenu pour votre application (spécialement dans VS 2010 et non une version antérieure), mais de l’autre côté, l’année dernière, je travaillais sur un programme qui utilisait la Suite Dev Component. comme vous le savez, sa structure ne fonctionne que dans .Net Framework 3.5 et ma plate-forme de programme était .Net Framework 4. Il en est de même pour votre application, ce qui est arrivé depuis mon application. Je devais rétrograder ma plate-forme à 3,5 et son travail était positif. l’expérience vous aider mec.

Je veux dire quelque chose d’autre, certaines erreurs ne dépendent pas de l’architecture du processeur. Ne vous inquiétez pas.

bonne chance. Ali Foroughi

La ligne liée à “TryCathcWhen” me fait penser à une exception non gérée au démarrage ou qu’une exception est émise dans un bloc catch au démarrage.

Voir votre code de démarrage serait utile.

J’ai vu cela se produire sur des machines sur lesquelles l’installation de .NET 3.5 / 4 a échoué / n’a pas abouti. Cependant, cela est également hautement improbable.

Vous devez essayer d’installer le débogage distant sur la machine (processus relativement simple), puis de définir la machine distante comme cible dans Visual Studio et d’exécuter le programme en mode débogage. Le programme se lancera ensuite sur la machine distante et vous obtiendrez l’erreur complète dans Visual Studio.

J’avais une application .Net 2.0 qui fonctionnait avec le débogage mais pas dans une version validée (après installation). Je ne recevais aucune journalisation de mon application directement, mes erreurs venaient directement de .NET. Le problème était que j’avais créé ma propre classe de programme avec un vide statique MAIN () à l’intérieur du bloc principal que j’avais un try...catch..finally blocage try...catch..finally . Pour une raison quelconque, .NET étouffait finally . Avez-vous quelque chose comme ça dans votre programme?

C’est vraiment une erreur générique. Dans mon cas, l’application récemment installée n’a pas réussi à créer sa propre source d’événements en raison d’permissions insuffisantes. Résolu (moche) en exécutant l’application une fois en mode “en tant qu’administrateur”. Assurez-vous que toutes les exceptions internes sont gérées. Les événements sont également une bonne source d’information.

Dans mon cas, le problème était résolu lorsque l’utilisateur installait la même version .Net FW que celle que je développais. (J’ai FW 4.5.1 et l’utilisateur avait FW 4.0).

Alors, vérifiez la version FW:

http://msdn.microsoft.com/library/hh925568(v=vs.110).aspx

Et installez exactement la même chose avant de réessayer d’exécuter