La modification de XAML entraîne le blocage du concepteur de Visual Studio.

Question originale


Je travaille sur une application WPF avec Visual Studio 2010, à l’aide de Telerik .

Chaque fois que j’utilisais le concepteur, je rencontrais beaucoup de crashs: cliquer sur un élément, changer sa position, même changer son nom, provoquait un crash et affichait l’exception suivante:

 System.ArgumentNullException Value cannot be null. to System.RuntimeType.MakeGenericType(Type[] instantiation) to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkUtil.GetRuntimeType(Type type) to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkType.TryGetRuntimeType() to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkUtil.EnsureRuntimeType(Type type) to Microsoft.VisualStudio.Shell.Design.VsTargetFrameworkProvider.GetRuntimeType(Type reflectionType) [...] 

J’ai essayé les choses suivantes:

  • Désinstaller et réinstaller Telerik;
  • Désinstallez et réinstallez .NET 4.0;
  • Désinstallez et réinstallez Visual Studio.

Aucune de ces tentatives n’a fonctionné.

Ce matin, j’ai remarqué que le concepteur ne s’était pas planté du tout et j’ai compris pourquoi: le concepteur se bloque lorsque j’ai ouvert ou modifié XAML .

Après avoir ouvert XAML, Visual Studio commence à geler et le concepteur se bloque à chaque fois que j’essaie de cliquer sur quelque chose. Si je ferme Visual Studio et génère la solution ( sans ouvrir XAML ), tout fonctionne correctement avec le concepteur.

Je suppose que quelque chose ne va pas lorsque Visual Studio essaie de “convertir” le code XAML en éléments graphiques dans le concepteur , et uniquement dans cette direction.


Question : Avez-vous déjà expérimenté ce genre de chose? Avez-vous une idée de la raison pour laquelle modifier le XAML provoque des plantages et comment le résoudre?

Merci d’avance.


Nouvelle tentative faite après avoir lu les réponses

  • Déboguez l’instance de Visual Studio elle-même lorsque le concepteur s’ouvre. La méthode qui aboutit à ArgumentNullException est GetRuntimeTime . J’ai pu voir le code .NET mais je n’ai pas pu déterminer la source du problème. Voir la trace de stack complète ci-dessous:

entrez la description de l'image ici

En outre, il s’agit de la ligne exacte où l’erreur se produit et des détails sur l’exception. Notez que le fichier est VSIsolationProviderService.cs et que je peux voir la source grâce au .NET Reflector Object Browser .

entrez la description de l'image ici

  Message=Value cannot be null. Source=mscorlib StackTrace: to System.RuntimeType.MakeGenericType(Type[] instantiation) InnerException: null 

Enfin, l’inspecteur Local Variables au moment de l’exception affiche l’object suivant:

entrez la description de l'image ici

Fin de l’object:

entrez la description de l'image ici

Réponses aux commentaires:

  • La valeur de this._targetFrameworkProvider sur la ligne où l’exception se produit est inférieure à. entrez la description de l'image ici

Je suppose que votre meilleur choix est de déboguer Visual Studio!

  • Exécutez Visual Studio (instance n ° 1) et chargez votre solution.
  • Exécuter une 2ème instance de Visual studio (# 2)
  • À partir de l’instance n ° 2, accédez au processus> Debug-> Attacher au processus-> Sélectionnez devenv.exe (instance n ° 1, assurez-vous de sélectionner le débogage géré).
  • Ensuite, sélectionnez Debug-> Exception, appuyez sur “Find ..” et recherchez System.ArgumentNull puis cochez “Thrown”
  • Allez à l’instance n ° 1, chargez votre vue dans le concepteur, cela devrait déclencher un point d’arrêt dans l’instance n ° 2 et vous montrer une trace complète de la stack. Ces informations devraient suffire à identifier le contrôle / composant incriminé.

Je crois que le problème que vous voyez est lié à l’un des contrôles que vous utilisez.

Laissez-moi d’abord vous montrer un moyen de reproduire ce problème; si c’est le même problème que vous voyez. (J’utilise VS 2013 qui gère ce problème un peu mieux que vs 2010)

Tout d’abord, j’ai créé un contrôle personnalisé qui est une zone de texte; et j’ai un code qui ressemble à quelque chose comme ça.

 public class CustomTextBox : TextBox { public ssortingng testText { get; set; } public CustomTextBox() : base() { if (ssortingng.IsNullOrEmpty(testText)) { throw new ArgumentNullException(); } } } 

alors je mets ce contrôle dans le xaml

    

Tout ce que je fais, c’est de lancer une exception lorsqu’une propriété a la valeur null lorsque le contrôle appelle son constructeur (ce que fera le concepteur lorsque celui-ci tente de le créer et de le restituer).

Dans VS2013, j’ai simplement une ligne rouge sous le contrôle dans le code XAML lui-même, mais l’expérience passée avec VS2010 a conduit ce concepteur à basculer.

Ce que je peux vous suggérer de faire, c’est de consulter le code XAML sans le concepteur et de supprimer tous les contrôles tiers / personnalisés, un à la fois. L’un de ces contrôles peut générer une exception pouvant produire ce que vous voyez. Si c’est l’un des contrôles Telerik, les contacter est une option.

Comme Gavin l’a déjà dit, essayez de trouver le contrôle qui pose problème.

Vous pouvez toujours modifier les fichiers dans VS si vous cliquez avec le bouton droit de la souris sur le fichier .xaml, sélectionnez Open With et choisissez Source Code (Text) Editor .

Vous pouvez le définir par défaut si vous vous attendez à ce qu’il se trouve dans un grand nombre de fichiers et le changer lorsque vous avez terminé.

Cette solution ouvrira les fichiers .xaml sans concepteur, mais avec (certains) intellisense.

En outre, j’ai lu quelque part que si vous démarrez vs en tant qu’administrateur, vous rencontrez des problèmes, essayez de démarrer Visual Studio et non en tant qu’administrateur

Lisez ceci , quelques choses au hasard que vous pouvez essayer ..

Vous pouvez essayer XAMLPAD pour tester votre page XAML.

Référence: https://msdn.microsoft.com/en-us/library/vstudio/ms742398(v=vs.90).aspx

J’espère que cela vous aide.

Si vous pensez qu’il peut être lié à un composant que vous utilisez, vous pouvez essayer de déboguer le mode Création de Visual Studio et de voir dans quel scénario l’exception ArgumentNullException est levée ou au moins obtenir CallStack lors de la levée de l’exception.

Voir ce lien: Comment résoudre et corriger les erreurs en mode Création de Visual Studio?

Personnellement, je le fais avec une instance de Blend et une instance de Visual Studio au lieu de deux instances de Visual Studio.

Je voudrais également essayer un nouveau projet complet sans aucune dépendance externe pour voir s’il pourrait être lié à votre installation de Visual Studio.

La rupture de VS2010 avec certains XAML est un problème assez connu.

Avez-vous essayé d’append ce code à l’événement Load du contrôle incriminé?

 if (System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) { return; } 

Qu’est-ce qui provoque le blocage du concepteur WPF VS 2010 SP1?

Essayez d’initialiser l’object runtimeType avec typeof (Type) en tant que

 Type runtimeType = typeof(Type) 

reflectionType,this,this._targetFrameworkProvider and this._targetFrameworkProvider.GetRunTimeType(reflectionType) également la valeur des variables reflectionType,this,this._targetFrameworkProvider and this._targetFrameworkProvider.GetRunTimeType(reflectionType) dans une surveillance pendant le débogage.

Cela pourrait vous aider.