Compartir a través de


Depurar una plantilla de texto T4

Puede establecer puntos de interrupción en plantillas de texto. Para depurar una plantilla de texto en tiempo de diseño, guarde el archivo de plantilla de texto y elija Depurar plantilla T4 en el menú contextual del archivo en el Explorador de soluciones. Para depurar una plantilla de texto en tiempo de ejecución, basta con depurar la aplicación a la que pertenece.

Para depurar una plantilla de texto, debe entender los pasos del proceso de transformación de plantillas. En cada paso pueden producirse diferentes clases de errores. Estos son los pasos.

Paso

Plantilla en tiempo de diseño: cuándo ocurre

Plantilla en tiempo de ejecución: cuándo ocurre

Se genera código a partir de la plantilla de texto.

Errores en directivas, o etiquetas <#…#> que no coinciden o no están ordenadas.

Cuando se guarda la plantilla o se invoca la transformación de texto.

Cuando se guarda la plantilla o se invoca la transformación de texto.

Se compila el código generado.

Errores de compilación en el código de plantilla.

Inmediatamente después del paso anterior.

Junto con el código de aplicación.

Se ejecuta el código.

Errores en tiempo de ejecución en el código de plantilla.

Inmediatamente después del paso anterior.

Cuando la aplicación se ejecuta e invoca el código de plantilla.

En la mayoría de los casos, el informe de errores muestra los números de línea del código de plantilla. Cuando el informe de errores hace referencia a un nombre de archivo temporal, la causa habitual es una falta de correspondencia en los corchetes del código de la plantilla de texto.

Puede establecer puntos de interrupción en las plantillas de texto y realizar la depuración de la forma habitual.

Errores frecuentes y soluciones

En la tabla siguiente se enumeran los errores más comunes y sus soluciones.

Mensaje de error

Descripción

Soluciones

Error al cargar la clase base '{0}' de la que se hereda la clase Transformation.

Se produce si no se encuentra la clase base especificada en el parámetro inherits en una directiva de plantilla. El mensaje proporciona el número de línea de la directiva de plantilla.

Asegúrese de que existe la clase especificada y de que el ensamblado en el que esta se encuentra se ha especificado en una directiva de ensamblado.

Error al resolver el texto de inclusión para el archivo: {0}

Se produce cuando no se encuentra una plantilla incluida. El mensaje proporciona el nombre del archivo de inclusión solicitado.

Asegúrese de que la ruta de acceso del archivo es relativa a la ruta de acceso de la plantilla original, el archivo está en una ubicación que está registrada con el host o hay una ruta de acceso completa al archivo.

Se generaron errores al inicializar el objeto de transformación. La transformación no se ejecutará.

Se produce cuando se produce un error en 'Initialize()' de la clase Transformation o cuando devuelve false.

El código de la función Initialize() procede de la clase base Transformation especificada en la directiva <#@template#> y de los procesadores de directivas. El error que impidió la inicialización probablemente figura en la lista de errores. Investigue por qué se produjo un error. Puede examinar el código generado real de Initialize() si sigue los procedimientos para depurar una plantilla.

El ensamblado '{0}' del procesador de directivas '{1}' no recibió el conjunto de permisos FullTrust. Solo los ensamblados de confianza tienen permiso para proporcionar procesadores de directivas. Este procesador de directivas no se cargará.

Se produce cuando el sistema no concede permisos FullTrust a un ensamblado que contiene un procesador de directivas. El mensaje proporciona el nombre del ensamblado y el nombre del procesador de directivas.

Asegúrese de que solo utiliza ensamblados de confianza en el equipo local.

La ruta de acceso '{0}' debe ser local para este equipo o parte de su zona de confianza.

Se produce cuando una directiva o una directiva de ensamblado hace referencia a un archivo que no está en el equipo local o en la zona de confianza de la red.

Asegúrese de que el directorio donde se encuentran la directiva o las directivas de ensamblado están en su zona de confianza. Puede agregar un directorio de red a la zona de confianza mediante Internet Explorer.

Varios errores de sintaxis como "El token 'catch' no es válido" o "Un espacio de nombres no puede contener directamente miembros"

Hay demasiadas llaves de cierre en el código de plantilla. El compilador está confundiéndolo con el código de generación estándar.

Compruebe el número de llaves y corchetes de cierre que hay dentro de los delimitadores de código.

Los bucles o los condicionales no se compilan o ejecutan correctamente. Por ejemplo:

<#if (i>10)#>
   Number is: <#= i #>.

Este código genera siempre el valor de i. Solo "Number is:" es condicional.

En C#, utilice siempre llaves para delimitar los bloques de texto que se incrustan en instrucciones de control.

Agregue llaves:

<#if (i>10) { #>
   Number is: <#= i #>.
<# } #>

"Expresión demasiado compleja" al procesar una plantilla en tiempo de diseño o compilar una plantilla en tiempo de ejecución (preprocesada).

Visual Studio deja de funcionar cuando se intenta inspeccionar código generado por una plantilla en tiempo de ejecución.

El bloque de texto es demasiado largo. T4 convierte los bloques de texto en una expresión de concatenación de cadenas, con un literal de cadena para cada línea de la plantilla. Los bloques de texto muy largos pueden sobrepasar los límites de tamaño del compilador.

Divida el bloque de texto largo con un bloque de expresiones como:

<#= "" #>

Descripciones de advertencias y soluciones

En la tabla siguiente se enumeran las advertencias más frecuentes junto con sus soluciones, si están disponibles.

Mensaje de advertencia

Descripción

Soluciones

Al cargar el archivo de inclusión '{0}' se devolvió una cadena nula o vacía.

Se produce si un archivo de plantilla de texto incluido está vacío. El mensaje proporciona el nombre del archivo incluido.

Quite la directiva de inclusión o asegúrese de que el archivo tiene algún contenido.

Compilando transformación:

Antepone esta cadena a todos los errores o advertencias que se originan en el compilador cuando este compila la transformación. Esta cadena significa que el compilador produjo un error o una advertencia.

Si tiene algún problema para encontrar el archivo DLL, puede que sea necesario proporcionar la ruta de acceso completa o un nombre seguro completo si el archivo DLL está en la GAC.

El parámetro '{0}' ya existe en la directiva. El parámetro duplicado se omitirá.

Se produce cuando se especifica un parámetro más de una vez en una directiva. El mensaje proporciona el nombre del parámetro y el número de línea de la directiva.

Quite la especificación de parámetro duplicada.

Error al cargar el archivo de inclusión '{0}'. Se omitirá la directiva.

Se produce cuando no se encuentra un archivo especificado en una directiva include. El mensaje proporciona el nombre del archivo y el número de línea de la directiva.

Asegúrese de que el archivo de inclusión existe en el mismo directorio que el archivo de plantilla de texto original o en uno de los directorios de inclusión que están registrados con el host.

Se especificó una clase base no válida para la clase Transformation. La clase base debe derivarse de Microsoft.VisualStudio.TextTemplating.TextTransformation.

Se produce cuando el parámetro inherits de una directiva de plantilla especifica una clase que no se hereda de TextTransformation. El mensaje proporciona el número de línea de la directiva de plantilla.

Especifique una clase que se derive de TextTransformation.

Se especificó una referencia cultural no válida en la directiva de plantilla. La referencia cultural debe tener el formato "xx-XX". Se usará la referencia cultural invariable.

Se produce cuando se especifica incorrectamente el parámetro de referencia cultural de una directiva de plantilla. El mensaje proporciona el número de línea de la directiva de plantilla.

Cambie el parámetro de referencia cultural a una referencia cultural válida con el formato "xx-XX".

Se especificó un valor de depuración no válido de '{0}' en la directiva de plantilla. El valor de depuración debe ser "true" o "false". Se usará el valor predeterminado ("false").

Se produce cuando se especifica incorrectamente el parámetro debug en una directiva de plantilla. El mensaje proporciona el número de línea de la directiva de plantilla.

Establezca el parámetro debug en "true" o "false".

Se especificó un valor HostSpecific no válido de '{0}' en la directiva de plantilla. El valor de HostSpecific debe ser "true" o "false". Se usará el valor predeterminado ("false").

Se produce cuando se especifica incorrectamente el parámetro específico del host en una directiva template. El mensaje proporciona el número de línea de la directiva de plantilla.

Establezca el parámetro específico del host en "true" o "false".

Se especificó un lenguaje no válido '{0}' en la directiva de plantilla. El lenguaje debe ser "C#" o "VB". Se usará el valor predeterminado de "C#".

Se produce cuando se especifica un lenguaje no compatible en la directiva template. Solo se permite "C#" o "VB" (sin distinción entre mayúsculas y minúsculas). El mensaje proporciona el número de línea de la directiva de plantilla.

Establezca el parámetro language de la directiva de plantilla en "C#" o "VB".

Se encontraron varias directivas de salida en la plantilla. Se omitirán todas menos la primera.

Se produce cuando se especifican varias directivas output en un archivo de plantilla. El mensaje proporciona el número de línea de la directiva de salida duplicada.

Quite las directivas output duplicadas.

Se encontraron varias directivas de plantilla en la plantilla. Se omitirán todas menos la primera. En una directiva de plantilla deben especificarse varios parámetros para la misma.

Se produce si especifica varias directivas template dentro de un archivo de plantilla de texto (incluso los archivos incluidos). El mensaje proporciona el número de línea de la directiva de plantilla duplicada.

Agregue las diferentes directivas template en una directiva template.

No se especificó ningún procesador para una directiva denominada '{0}'. Se omitirá la directiva.

Se produce si especifica una directiva custom, pero no proporciona un atributo processor. El mensaje proporciona el nombre de la directiva y el número de línea.

Proporcione un atributo processor con el nombre del procesador directive de la directiva.

No se encontró ningún procesador denominado '{0}' para la directiva '{1}'. Se omitirá la directiva.

Se produce cuando el sistema no puede encontrar el procesador directive especificado dentro de una directiva custom. El mensaje proporciona el nombre de la directiva, el nombre del procesador y el número de línea de la directiva.

Establezca el atributo processor de la directiva en el nombre del procesador de directivas.

No se encontró un parámetro necesario '{0}' para la directiva '{1}'. Se omitirá la directiva.

Se produce cuando el sistema no proporciona un parámetro de directiva necesario. El mensaje proporciona el nombre del parámetro que falta, el nombre de la directiva y el número de línea.

Proporcione el parámetro que falta.

El procesador '{0}' no admite la directiva denominada '{1}'. Se omitirá la directiva.

Se produce cuando un procesador de directivas no admite una directiva. El mensaje proporciona el nombre y número de línea de la directiva que provoca el error, junto con el nombre del procesador de directivas.

Corrija el nombre de la directiva.

La directiva de inclusión para el archivo '{0}' produce un bucle infinito.

Se muestra si se especifican directivas de inclusión circulares (por ejemplo, el archivo A incluye el archivo B, que incluye el archivo A).

No especifique directivas de inclusión circulares.

Ejecutando transformación:

Antepone esta cadena a todos los errores o advertencias que se generan mientras se ejecuta la transformación.

No es aplicable.

Se encontró una etiqueta inicial o final inesperada dentro de un bloque. Asegúrese de que no escribió una etiqueta inicial o final por error y de que no tiene bloques anidados en la plantilla.

Se muestra cuando hay un carácter <# o #> inesperado. Es decir, si hay un carácter <# después de otra etiqueta de apertura que no se ha cerrado o si hay un carácter #> cuando no hay ninguna etiqueta de apertura sin cerrar delante. El mensaje proporciona el número de línea de la etiqueta no coincidente.

Quite la etiqueta de apertura o de cierre no coincidente, o utilice un carácter de escape.

Se especificó una directiva con formato incorrecto. Se omitirá la directiva. Especifique la directiva con el formato <#@ nombre [nombredeparámetro="valordeparámetro"]* #>

Lo muestra el analizador si una directiva no se especifica en el formato correcto. El mensaje proporciona el número de línea de la directiva incorrecta.

Asegúrese de que todas las directivas tienen el formato <#@ nombre [nombredeparámetro="valordeparámetro"]* #>. Para obtener más información, vea Directivas de plantilla de texto T4.

Error al cargar el ensamblado '{0}' para el procesador de directivas registrado '{1}'.

{2}

Se produce cuando el host no puede cargar un procesador de directivas. El mensaje identifica el ensamblado proporcionado para el procesador de directivas y el nombre del procesador de directivas.

Asegúrese de que el procesador de directivas está registrado correctamente y de que el ensamblado existe.

Error al buscar el tipo '{0}' en el ensamblado '{1}' para el procesador de directivas registrado '{2}'.

{3}

Se produce cuando un tipo de procesador de directivas no se puede cargar desde su ensamblado. El mensaje proporciona el nombre del tipo, el ensamblado y el procesador de directivas.

vshost busca la información del procesador de directivas (nombre, ensamblado y tipo) en el Registro. Asegúrese de que el procesador de directivas está registrado correctamente y de que el tipo existe en el ensamblado.

Problema al cargar el ensamblado '{0}'

Se produce cuando hay un problema al cargar un ensamblado. El mensaje proporciona el nombre del ensamblado.

Puede especificar que se carguen ensamblados en directivas <@#assembly#> y mediante procesadores de directivas. El mensaje de error que sigue a esta cadena debe proporcionar más datos sobre el motivo del error al cargar el ensamblado.

Problema al crear e inicializar el procesador para una directiva denominada '{1}'. El tipo del procesador es {0}. Se omitirá la directiva.

Se produce cuando el sistema no puede crear o inicializar un procesador de directivas. El mensaje proporciona el nombre y el número de línea de la directiva y el tipo del procesador.

Asegúrese de que utiliza el procesador de directivas correcto y de que este tiene un constructor predeterminado público. De lo contrario, utilice las opciones de depuración para averiguar por qué el método Initialize() del procesador de directivas está produciendo un error. Para obtener más información, vea Depurar una plantilla de texto T4.

Excepción generada al procesar una directiva denominada '{0}'.

Se produce cuando un procesador de directivas produce una excepción al procesar una directiva.

Asegúrese de que los parámetros del procesador de directivas son correctos.

El host generó una excepción al intentar resolver la referencia de ensamblado '{0}'.

Se produce cuando el host genera una excepción cuando intenta resolver una referencia de ensamblado. El mensaje proporciona la cadena de referencia del ensamblado.

Las referencias del ensamblado proceden de directivas <@#assembly#> y de procesadores de directivas. Asegúrese de que el parámetro 'name' proporcionado en el parámetro de ensamblado es correcto.

Se intentó especificar un valor {1} '{0}' no admitido para la directiva {2}

Lo produce RequiresProvidesDirectiveProcessor (todos los procesadores de directivas generados derivan de él) cuando proporciona un argumento requires o provides no admitido.

Asegúrese de que los nombres de los pares name='value' proporcionados en los parámetros requires y provides son correctos.