Compartir a través de


Tutorial: Depurar una plantilla de texto que tiene acceso a un modelo

Al modificar o agregar plantillas de texto en una solución de lenguaje específico de dominio, puede recibir errores cuando el motor transforma la plantilla en código fuente o cuando compila el código generado. En el siguiente tutorial se muestran algunas de las cosas que puede hacer para depurar una plantilla de texto.

Nota

Para más información sobre las plantillas de texto en general, consulte Generación de código y plantillas de texto T4. Para más información sobre cómo depurar plantillas de texto, consulte Tutorial: Depuración de una plantilla de texto.

Creación de una solución de lenguaje específico de dominio

En este procedimiento, creará una solución de lenguaje específico de dominio que tiene las siguientes características:

Creación de una plantilla de texto

Agregue una plantilla de texto a la solución.

Para crear una plantilla de texto

  1. Compile la solución y empiece a ejecutarla en el depurador. (En el menú Compilar, haga clic en Recompilar solución y, a continuación, en el menú Depurar, haga clic en Iniciar depuración). Una nueva instancia de Visual Studio abre el proyecto de depuración.

  2. Agregue un archivo de texto denominado DebugTest.tt al proyecto de depuración.

  3. Asegúrese de que la propiedad Herramienta personalizada de DebugTest.tt esté establecida en TextTemplatingFileGenerator.

Directivas de depuración que acceden a un modelo desde una plantilla de texto

Para poder acceder a un modelo desde las instrucciones y expresiones de una plantilla de texto, primero debe llamar a un procesador de directivas generadas. La llamada al procesador de directivas generadas, hace que las clases del modelo estén disponibles para el código de la plantilla de texto como propiedades. Para más información, consulte Acceso a modelos desde plantillas de texto.

En los siguientes procedimientos, depurará un nombre de directiva y un nombre de propiedad incorrectos.

Para depurar un nombre de directiva incorrecto

  1. Reemplace el código de DebugTest.tt por el código siguiente:

    Nota

    El código contiene un error. Está introduciendo el error para depurarlo.

    <#@ template language="C#" inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation"#>
    <#@ output extension=".txt" #>
    <#@ modelRoot processor="DebuggingTestLanguageDirectiveProcessor" requires="fileName='Sample.ddd'" provides="ExampleModel=ExampleModel" #>
    
    Model: <#= this.ExampleModel #>
    <#
    foreach (ExampleElement element in this.ExampleModel.Elements)
    {
    #>
        Element: <#= element.Name #>
    <#
    }
    #>
    
  2. En el Explorador de soluciones, haga clic con el botón derecho en DebugTest.tt y, a continuación, haga clic en Ejecutar herramienta personalizada.

    La ventana Lista de errores muestra este error:

    El procesador denominado "DebuggingTestLanguageDirectiveProcessor" no admite la directiva denominada "modelRoot". La transformación no se ejecutará.

    En este caso, la llamada de directiva contiene un nombre de directiva incorrecto. Ha especificado modelRoot como nombre de directiva, pero el nombre de directiva correcto es DebuggingTestLanguage.

  3. Haga doble clic en el error en la ventana Lista de errores para ir al código.

  4. Para corregir el código, cambie el nombre de la directiva a DebuggingTestLanguage.

    El cambio está resaltado.

    <#@ DebuggingTestLanguage processor="DebuggingTestLanguageDirectiveProcessor" requires="fileName='Sample.ddd'" provides="ExampleModel=ExampleModel" #>
    
  5. En el Explorador de soluciones, haga clic con el botón derecho en DebugTest.tt y, a continuación, haga clic en Ejecutar herramienta personalizada.

    Ahora, el sistema transforma la plantilla de texto y genera el archivo de salida correspondiente. No verá ningún error en la ventana Lista de errores.

Para depurar un nombre de propiedad incorrecto

  1. Reemplace el código de DebugTest.tt por el código siguiente:

    Nota

    El código contiene un error. Está introduciendo el error para depurarlo.

    <#@ template language="C#" inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation"#>
    <#@ output extension=".txt" #>
    <#@ DebuggingTestLanguage processor="DebuggingTestLanguageDirectiveProcessor" requires="fileName='Sample.ddd'" provides="ExampleModel=LibraryModel" #>
    
    Model: <#= this.ExampleModel #>
    <#
    foreach (ExampleElement element in this.ExampleModel.Elements)
    {
    #>
        Element: <#= element.Name #>
    <#
    }
    #>
    
  2. En el Explorador de soluciones, haga clic con el botón derecho en DebugTest.tt y, a continuación, haga clic en Ejecutar herramienta personalizada.

    Aparece la ventana Lista de errores y muestra uno de estos errores:

    (C#)

    Compilando transformación: Microsoft.VisualStudio.TextTemplating<GUID>. GeneratedTextTransformation" no contiene una definición de "ExampleModel".

    (Visual Basic)

    Compilando transformación: "ExampleModel" no es miembro de "Microsoft.VisualStudio.TextTemplating<GUID>.GeneratedTextTransformation".

    En este caso, el código de plantilla de texto contiene un nombre de propiedad incorrecto. Ha especificado ExampleModel como nombre de propiedad, pero el nombre de propiedad correcto es LibraryModel. Puede encontrar el nombre de propiedad correcto en el parámetro "provides", como se muestra en el código siguiente:

    <#@ DebuggingTestLanguage processor="DebuggingTestLanguageDirectiveProcessor" requires="fileName='Sample.ddd'" provides="ExampleModel=LibraryModel" #>
    
  3. Haga doble clic en el error en la ventana Lista de errores para ir al código.

  4. Para corregir el código, cambie el nombre de la propiedad a LibraryModel en el código de plantilla de texto.

    Los cambios aparecen resaltados.

    <#@ template language="C#" inherits="Microsoft.VisualStudio.TextTemplating.VSHost.ModelingTextTransformation"#>
    <#@ output extension=".txt" #>
    <#@ DebuggingTestLanguage processor="DebuggingTestLanguageDirectiveProcessor" requires="fileName='Sample.ddd'" provides="ExampleModel=LibraryModel" #>
    
    Model: <#= this.LibraryModel #>
    <#
    foreach (ExampleElement element in this.LibraryModel.Elements)
    {
    #>
        Element: <#= element.Name #>
    <#
    }
    #>
    
  5. En el Explorador de soluciones, haga clic con el botón derecho en DebugTest.tt y, a continuación, haga clic en Ejecutar herramienta personalizada.

    Ahora, el sistema transforma la plantilla de texto y genera el archivo de salida correspondiente. No verá ningún error en la ventana Lista de errores.