web-dev-qa-db-fra.com

Erreur lors de l'utilisation d'un point d'arrêt conditionnel sur System.Type

Voici la fonction:

public void Init(System.Type Type) {
    this.Type = Type;
    BuildFieldAttributes();
    BuildDataColumns(FieldAttributes);
}

J'ai défini un point d'arrêt sur la première ligne (this.Type = Type) et je veux rompre quand Type.FullName == "Malt.Organisation" c'est donc ce que j'ai entré comme condition.

Cependant, l'erreur suivante s'affiche lorsque la ligne est atteinte:

La condition d'un point d'arrêt n'a pas pu être exécutée. La condition était 'Type.FullName == "Malt.Organisation"'. L'erreur renvoyée était "Inspecter l'état d'un objet dans le débogueur de type System.Type n'est pas pris en charge dans ce contexte".

Quelle chose (évidente) fais-je de mal?

PS. Une solution de contournement consiste à ajouter ceci au code:

if (Type.FullName == "Malt.Organisation") System.Diagnostics.Debugger.Break();
35
Rob Nicholson

Dans mon cas, j'utilisais Visual Studio 2013, NUnit 2.6.4 et joignais un débogueur à une session de test unitaire, et j'obtenais un message similaire:

La condition d'un point d'arrêt n'a pas pu être exécutée. La condition était 'type.Name.Contains ("FooBar")'. L'erreur renvoyée était "Inspecter l'état d'un objet dans le débogueur de type System.Type n'est pas pris en charge dans ce contexte". Cliquez sur OK pour vous arrêter à ce point d'arrêt.

Cela était dû à une fonctionnalité manquante dans le nouveau moteur de débogage que Microsoft avait apparemment introduit. En suivant les instructions de ce blogpost msdn J'ai fait fonctionner les choses. Les instructions se résument à:

  1. Dans le menu " Outils " ouvrez " Options "
  2. Sur le côté gauche, choisissez " Débogage ", " Général "
  3. Faites défiler jusqu'en bas pour vérifier " Utiliser le mode de compatibilité géré "

Cela devrait passer au moteur de débogage hérité, qui dans mon cas autorisait les expressions sur Type dans des conditions de point d'arrêt. Notez que vous devez évidemment redémarrer votre application ou votre session de débogage.

Avertissement: je n'ai aucune idée des autres effets de la vérification de cette option. Personnellement, je l'ai désactivé lorsque j'ai terminé la tâche qui le nécessitait ...

51
Jeroen

Vous dites que Type.FullName == "Malt.Organisation" le fait casser, avez-vous essayé this.Type.FullName == "Malt.Organisation"?

Une autre possibilité, le débogueur pense-t-il que vous essayez d'invoquer une méthode statique avec la variable nommée Type comme son nom de classe? Le fait de renommer la variable Type en quelque chose d'autre le corrige-t-il?

4
Daniel Stone

Je suis tombé sur cela, mais lors des tests pour IsInterface dans une application Web. Au lieu d'activer des fonctionnalités supplémentaires dans le débogueur, j'ai simplement triché.

bool blnIsInterface = tType.IsInterface;

//Insert breakpoint here...
if(blnIsInterface)
{
    ...
}

Donc, dans votre cas, vous pourriez faire quelque chose comme

public void Init(System.Type Type) {
    bool blnBreak = Type.FullName == "Malt.Organisation";
    //insert breakpoint of blnBreak == true
    this.Type = Type;
    BuildFieldAttributes();
    BuildDataColumns(FieldAttributes);
}

C'est un peu lourd mais au moins vous n'aurez pas à vous soucier des résultats de performance et l'activation du débogage de code natif ne semble pas être une option dans les applications Web.

3
Wes Hanney

Je ne suis pas sûr de la solution "Utiliser le mode de compatibilité géré" décrite ici - ne m'a pas aidé, mais dans mon propre cas Project > Properties > Debug > Enable Native code debugging - doit être décoché.

Pourquoi - aucun indice actuellement.

Utilisait .net 4.5, vs2015, application console.

1
TarmoPikaro