Débogage d'un modèle de texte T4
Vous pouvez définir des points d’arrêt dans les modèles de texte. Pour déboguer un modèle de texte au moment de la conception, enregistrez le fichier de modèle de texte, puis choisissez Déboguer le modèle T4 dans le menu contextuel du fichier dans l’Explorateur de solutions. Pour déboguer un modèle de texte au moment de l’exécution, déboguez simplement l’application à laquelle il appartient.
Pour déboguer un modèle de texte, vous devez comprendre les étapes du processus de transformation de modèle. Différents types d’erreurs peuvent se produire au cours de chaque étape. Les étapes sont les suivantes.
Étape | Modèle au moment de la conception : quand cela se produit | Modèle au moment de l’exécution : quand cela se produit |
---|---|---|
Le code est généré à partir du modèle de texte. Erreurs dans les directives, ou balises <#...#> incompatibles ou désordonnée. |
Lorsque vous enregistrez le modèle ou appelez la transformation de texte. | Lorsque vous enregistrez le modèle ou appelez la transformation de texte. |
Le code généré est compilé. Erreurs de compilation dans votre code de modèle. |
Immédiatement après l’étape précédente. | Avec le code de votre application. |
Exécutions de code. Erreurs au moment de l’exécution dans votre code de modèle. |
Immédiatement après l’étape précédente. | Lorsque votre application s’exécute et appelle le code du modèle. |
Dans la plupart des cas, les numéros de ligne dans le code du modèle sont indiqués dans le rapport d’erreurs. Lorsque le rapport d’erreurs fait référence à un nom de fichier temporaire, la cause habituelle est un crochet incompatible dans le code du modèle de texte.
Vous pouvez définir des points d’arrêt dans les modèles de texte et déboguer de la manière habituelle.
Erreurs courantes et correctifs
Le tableau suivant répertorie les erreurs les plus courantes et leurs correctifs.
Message d’erreur | Description | Solution |
---|---|---|
Échec de chargement de la classe de base « {0} » à partir de laquelle la classe Transformation hérite. | Se produit si vous ne trouvez pas la classe de base spécifiée dans le paramètre inherits dans une directive de modèle. Le message fournit le numéro de ligne de la directive de modèle. |
Vérifiez que la classe spécifiée existe et que l’assembly dans lequel elle existe est spécifié dans une directive d’assembly. |
Impossible de résoudre le texte include pour le fichier : {0} | Se produit lorsque vous ne trouvez pas de modèle include. Le message fournit le nom du fichier include demandé. | Assurez-vous que le chemin d’accès au fichier est relatif au chemin du modèle d’origine, que le fichier se trouve à un emplacement inscrit auprès de l’hôte ou qu’il existe un chemin d’accès complet au fichier. |
Des erreurs ont été générées lors de l’initialisation de l’objet de transformation. La transformation ne sera pas exécutée. | Se produit lorsque la fonction « Initialize() » de la classe de transformation a échoué ou est retourné false. | Le code de la fonction Initialize() provient de la classe de transformation de base spécifiée dans la directive <#@template#> et des processeurs de directive. L’erreur qui a provoqué l’échec de l’initialisation figure probablement dans la liste d’erreurs. Examinez les raisons de son échec. Vous pouvez examiner le code généré réel pour Initialize() en suivant les procédures de débogage d’un modèle. |
L’assembly « {0} » pour le processeur de directive « {1} » n’a pas reçu le jeu d’autorisations FullTrust. Seuls les assemblys de confiance sont autorisés à fournir des processeurs de directive. Ce processeur de directive ne sera pas chargé. | Se produit lorsque le système n’accorde pas d’autorisations FullTrust à un assembly contenant un processeur de directive. Le message fournit le nom de l’assembly et le nom du processeur de directive. | Veillez à utiliser uniquement des assemblys de confiance sur l’ordinateur local. |
Le chemin d’accès « {0} » doit être local sur cet ordinateur ou faire partie de votre zone de confiance. | Se produit lorsqu’une directive ou une directive d’assembly fait référence à un fichier qui ne se trouve pas sur votre ordinateur local ou sur la zone de confiance de votre réseau. | Assurez-vous que le répertoire où se trouvent la directive ou les directives d’assembly se trouve dans votre zone de confiance. Vous pouvez ajouter un répertoire réseau à votre zone de confiance via Internet Explorer. |
Plusieurs erreurs de syntaxe telles que « Jeton ’catch’ non valide » ou « Un espace de noms ne peut pas contenir directement des membres » | Trop d’accolades fermantes dans votre code de modèle. Le compilateur les confond avec le code de génération standard. | Vérifiez le nombre d’accolades et de crochets fermants à l’intérieur des délimiteurs de code. |
Boucles ou conditions non compilées ou exécutées correctement. Par exemple : <#if (i>10)#> Number is: <#= i #> .Ce code donne toujours la valeur de i. Seul « Le nombre est : » est conditionnel. |
En C#, utilisez toujours des accolades pour entourer les blocs de texte incorporés dans les instructions de contrôle. | Ajouter des accolades : <#if (i>10) { #> Number is: <#= i #><# } #> . |
« Expression trop complexe » lors du traitement d’un modèle au moment de la conception ou de la compilation d’un modèle runtime (prétraité). Visual Studio cesse de fonctionner lors de la tentative d’inspection du code généré par un modèle runtime. |
Le bloc de texte est trop long. T4 convertit les blocs de texte en expression de concaténation de chaîne, avec un littéral de chaîne pour chaque ligne de modèle. Les blocs de texte très longs peuvent dépasser les limites de taille du compilateur. | Divisez le bloc de texte long avec un bloc d’expression tel que :<#= "" #> |
Descriptions et correctifs des avertissements
Le tableau suivant répertorie les avertissements les plus courants ainsi que les correctifs, le cas échéant.
Message d’avertissement | Description | Solution |
---|---|---|
Le chargement du fichier include « {0} » a retourné une chaîne nulle ou vide. | Se produit si un fichier de modèle texte inclus est vide. Le message fournit le nom du fichier inclus. | Supprimez la directive include ou vérifiez que le fichier contient du contenu. |
Compilation de la transformation : | Ajoute cette chaîne à toutes les erreurs ou avertissements provenant du compilateur lors de la compilation de la transformation. Cette chaîne signifie que le compilateur a levé une erreur ou un avertissement. | Si vous avez des difficultés à trouver la DLL, vous devrez peut-être fournir le chemin d’accès complet ou un nom fort complet si la DLL se trouve dans le GAC. |
Le paramètre « {0} » existe déjà dans la directive. Le paramètre dupliqué est ignoré. | Se produit lorsqu’un paramètre est spécifié plusieurs fois dans une directive. Le message fournit le nom du paramètre et le numéro de ligne de la directive. | Supprimez la spécification du paramètre dupliqué. |
Une erreur s’est produite durant le chargement du fichier include « {0} ». La directive include est ignorée. | Se produit lorsque vous ne trouvez pas un fichier spécifié dans une directive include . Le message fournit le nom du fichier et le numéro de ligne de la directive. |
Vérifiez que le fichier include existe dans le même répertoire que le fichier de modèle texte d’origine ou dans l’un des répertoires include enregistrés auprès de l’hôte. |
Une classe de base non valide a été spécifiée pour la classe Transformation. La classe de base doit dériver de Microsoft.VisualStudio.TextTemplating.TextTransformation. | Se produit lorsque le paramètre inherits dans une directive de modèle spécifie une classe qui n’hérite pas de TextTransformation . Le message fournit le numéro de ligne de la directive de modèle. |
Spécifiez une classe qui dérive de TextTransformation . |
Une culture non valide a été spécifiée dans la directive « modèle ». La culture doit être au format « xx-XX ». La culture invariante sera utilisée. | Se produit lorsque le paramètre de culture d’une directive de modèle est spécifié incorrectement. Le message fournit le numéro de ligne de la directive de modèle. | Remplacez le paramètre de culture par une culture valide au format « xx-XX ». |
Une valeur de débogage « {0} » non valide a été spécifiée dans la directive du modèle. La valeur de débogage doit être « true » ou « false ». La valeur par défaut « false » sera utilisée. | Se produit lorsque le paramètre debug d’une directive de modèle est spécifié incorrectement. Le message fournit le numéro de ligne de la directive de modèle. |
Définissez le paramètre de débogage sur « true » ou « false ». |
Une valeur HostSpecific « {0} » non valide a été spécifiée dans la directive du modèle. La valeur HostSpecific doit être « true » ou « false ». La valeur par défaut « false » sera utilisée. | Se produit lorsque le paramètre spécifique à l’hôte d’une directive template est spécifié incorrectement. Le message fournit le numéro de ligne de la directive de modèle. |
Définissez le paramètre spécifique à l’hôte sur « true » ou « false ». |
Un langage non valide « {0} » a été spécifié dans la directive « modèle ». Le langage doit être « C# » ou « VB ». La valeur par défaut de C# sera utilisée. | Se produit lorsqu’un langage non pris en charge est spécifiée dans la directive template . Seuls « C# » ou « VB » sont autorisés (sans respect de la casse). Le message fournit le numéro de ligne de la directive de modèle. |
Définissez le paramètre language dans la directive de modèle sur « C# » ou « VB ». |
Plusieurs directives de sortie ont été trouvées dans le modèle. Toutes, sauf la première, seront ignorées. | Se produit lorsque plusieurs directives output sont spécifiées dans un fichier de modèle. Le message fournit le numéro de ligne de la directive de sortie en double. |
Supprimez les directives output en double. |
Plusieurs modèles de sortie ont été trouvés dans le modèle. Tous, sauf le premier, seront ignorés. Plusieurs paramètres de la directive de modèle doivent être spécifiés dans une directive de modèle. | Se produit si vous spécifiez plusieurs directives template dans un fichier de modèle de texte (y compris les fichiers inclus). Le message fournit le numéro de ligne de la directive de modèle en double. |
Agrégez les différentes directives template en une seule directive template . |
Aucun processeur n’a été spécifié pour une directive nommée « {0} ». La directive sera ignorée. | Se produit si vous spécifiez une directive custom , mais que vous ne fournissez pas d’attribut processor . Le message fournit le nom de la directive et le numéro de ligne. |
Fournissez un attribut processor avec le nom du processeur directive pour la directive. |
Un processeur nommé « {0} » est introuvable pour la directive nommée « {1} ». La directive sera ignorée. | Se produit lorsque le système ne trouve pas le processeur directive que vous avez spécifié dans une directive custom . Le message fournit le nom de la directive, le nom du processeur et le numéro de ligne de la directive. |
Définissez l’attribut processor dans la directive sur le nom du processeur de la directive. |
Le paramètre obligatoire « {0} » de la directive « {1} » est introuvable. La directive sera ignorée. | Se produit lorsque le système ne fournit pas de paramètre de directive requis. Le message fournit le nom du paramètre manquant, le nom de la directive et le numéro de ligne. | Fournissez le paramètre manquant. |
Le processeur nommé « {0} » ne prend pas en charge la directive nommée « {1} ». La directive sera ignorée. | Se produit lorsqu’un processeur de directives ne prend pas en charge une directive. Le message fournit le nom et le numéro de ligne de la directive incriminé, ainsi que le nom du processeur de la directive. | Corrigez le nom de la directive. |
La directive include pour le fichier « {0} » provoque une boucle infinie. | Affiché si des directives include circulaires sont spécifiées (par exemple, le fichier A inclut le fichier B, qui inclut le fichier A). | Ne spécifiez pas de directives include circulaires. |
Exécution de la transformation : | Ajoute cette chaîne à toutes les erreurs ou avertissements générés lors de l’exécution de la transformation. | Non applicable. |
Une balise de début ou de fin inattendue a été trouvée dans un bloc. Assurez-vous que vous n’avez pas commis d’erreur dans la saisie d’une balise de début ou de fin et que vous n’avez pas de blocs imbriqués dans le modèle. | Affiché lorsque vous avez un nombre < ou > inattendu. Autrement dit, si vous avez un nombre < après une autre balise ouverte qui n’a pas été fermée, ou si vous avez un nombre > quand aucune balise ouverte non fermée n’est devant. Le message indique le numéro de ligne de la balise incompatible. | Supprimez la balise de début ou de fin incompatible, ou utilisez un caractère d’échappement. |
Une directive a été spécifiée dans le format incorrect. La directive sera ignorée. Veuillez spécifier la directive au format <#@ name [parametername="parametervalue"]* #> |
Affiché par l’analyseur si une directive n’est pas spécifiée dans le format correct. Le message fournit le numéro de ligne de la directive incorrecte. | Vérifiez que toutes les directives sont au format <#@ name [parametername="parametervalue"]* #> . Pour plus d’informations, consultez Directives de modèle de texte T4. |
Échec de chargement de l'assembly « {0} » pour le processeur de directive inscrit « {1} » {2} |
Se produit lorsqu’un processeur de directives n’a pas pu être chargé par l’hôte. Le message identifie l’assembly fourni pour le processeur de directives et le nom du processeur de directives. | Vérifiez que le processeur de directives est inscrit correctement et que l’assembly existe. |
Impossible de localiser le type « {0} » dans l'assembly « {1} » pour le processeur de directive inscrit « {2} » {3} |
Se produit lorsqu’un type de processeur de directives n’a pas pu être chargé à partir de son assembly. Le message fournit le nom du type, de l’assembly et du processeur de directives. | Le vshost trouve les informations du processeur de directives (nom, assembly et type) dans le registre. Vérifiez que le processeur de directives est inscrit correctement et que le type existe dans l’assembly. |
Un problème est survenu durant le chargement de l'assembly « {0} » | Se produit en cas de problème de chargement d’un assembly. Le message indique le nom de l’assembly. | Vous pouvez spécifier des assemblys à charger dans les directives <@#assembly#> et par processeurs de directives. Le message d’erreur qui suit cette chaîne doit fournir plus de données sur la raison de l’échec du chargement de l’assembly. |
Un problème s’est produit lors de la création et de l’initialisation du processeur pour une directive nommée « {1} ». Le type du processeur est {0}. La directive sera ignorée. | Se produit lorsque le système n’a pas pu créer ou initialiser un processeur de directives. Le message fournit le nom et le numéro de ligne de la directive et le type du processeur. | Veillez à utiliser le processeur de directives correct et que celui-ci dispose d’un constructeur public par défaut. Sinon, utilisez les options de débogage pour savoir pourquoi la méthode Initialize() du processeur de directives échoue. Pour plus d’informations, consultez Résolution des problèmes liés aux modèles de texte. |
Une exception a été levée lors du traitement d’une directive nommée « {0} ». | Se produit lorsqu’un processeur de directives lève une exception lors du traitement d’une directive. | Assurez-vous que les paramètres du processeur de directives sont corrects. |
L’hôte a levé une exception lors de la tentative de résolution de la référence d’assembly « {0} ». | Se produit lorsque l’hôte lève une exception lorsqu’il tente de résoudre une référence d’assembly. Le message fournit la chaîne de référence d’assembly. | Les références d’assembly proviennent de directives <@#assembly#> et de processeurs de directives. Assurez-vous que le paramètre « nom » fourni dans le paramètre d’assembly est correct. |
Tentative de spécification d'une valeur {1} non prise en charge « {0} » pour la directive {2} | Se produit avec le RequiresProvidesDirectiveProcessor (tous nos processeurs de directives générés dérivent de celui-ci), lorsque vous fournissez un argument requires ou provides non pris en charge. | Assurez-vous que les noms dans les paires name='value' fournis dans les paramètres requires et provides sont corrects. |