2010-08-17 8 views
8

Estoy intentando depurar una plantilla T4 preprocesada y no puedo entrar en la clase creada ejecutando la plantilla preprocesada. Puedo crear una instancia de la clase, pero tan pronto como trato de entrar en la depuración, aparece una nueva ventana que diceLa depuración de la plantilla preprocesada T4 no funciona - Visual Studio 2010 RTM

No hay fuente disponible. No hay un código fuente disponible para la ubicación actual.

Mi comprensión es que las plantillas preprocesadas se pueden depurar al igual que una clase C# normal, ¿no es así? ¿Hay algo en particular que deba hacer para poder ingresar a la clase definida por una plantilla preprocesada?

Aquí es una plantilla muy simple y el código de llamada que soy experimentar el problema:

TestPreprocessedTemplate.tt: Código

<#@ template language="C#" debug="true" #> 
Hello <# Write("World"); #> 

prueba:

var template = new TestPreprocessedTemplate(); 
string test = template.TransformText(); 

Editar - Agregado la declaración debug = "true" según la sugerencia a continuación, sigue teniendo el mismo problema.

actualización - Yo también publicó esta pregunta en los foros de MSDN y recibió respuesta por parte de un empleado de la EM que indicaba que sí lo he descrito anteriormente debe hecho trabajar. ¿Alguien más se encuentra con este problema?

Actualización - Con algo de ayuda de los foros de MSDN, parece que el problema es con las directivas #line que se agregan a la clase C# generada. Comentarlos me permite recorrer el código como se esperaba. ¿Hay alguna forma de evitar que estas directivas se agreguen a la clase generada? Con una página ASP.NET puede agregar el parámetro LinePragmas = "false", pero eso no parece tener ningún efecto en una plantilla T4. ¿Algunas ideas?

+0

Parece que usted está utilizando el editor de T4 tangible, que exhibe este problema. Si deshabilita este editor, debería encontrar que la depuración de una plantilla preprocesada lo lleva al lugar correcto en el archivo tt mismo. Si realmente desea depurar el archivo C#/VB generado, entonces la técnica de Paiden para eliminar las directivas #line descritas a continuación es buena. – GarethJ

+0

Consulte la pregunta relacionada http://stackoverflow.com/q/2945450/141172 –

Respuesta

1

Parece que falta el elemento debug="true" en el encabezado de la plantilla que es necesario para la depuración.

También echaré un vistazo al siguiente artículo de blog que repasa la eliminación de plantillas T4 en gran detalle.

+0

Lo intenté también, y solo para asegurarme de que lo intenté nuevamente, ejecuté la plantilla e intenté depurarla nuevamente. Mismo problema ... En cuanto al artículo, ya lo había encontrado antes y puedo depurar una plantilla t4 normal, pero cuando intento depurar la plantilla preprocesada, no puedo. – user423293

1

Actualización - Con la ayuda de los foros de MSDN, parece que el problema es con las directivas line que pueden ser añadidos a la clase C# generada. Comentarlos me permite recorrer el código como se esperaba. ¿Hay alguna manera de evitar que estas directivas se agreguen a la clase generada? Con un ASP.NET puede agregar el parámetro LinePragmas = "false", pero eso no parece tener ningún efecto en una plantilla T4. ¿Algunas ideas?

Las directivas line en realidad producen problemas al depurar preprocesado plantillas T4 (el depurador siempre busca el archivo * .tt en lugar del archivo generado * .cs). No pude encontrar ninguna opción para cambiar la generación de las directivas #line. Así que estoy usando la siguiente macro VisualStudio para deshacerse de ellos

Sub RemoveLineDirectives() 
    DTE.ActiveDocument.Selection.SelectAll() 
    DTE.ActiveDocument.Selection.ReplaceText("#line", "//#line") 
End Sub 

Siempre estoy asignar la macro a algún comando corto dentro de la ventana de comandos

alias rl Macros.MyMacros.Module1.RemoveLineDirectives 

por lo que soy capaz de eliminar las directivas #line simplemente invocando rl en la ventana de comandos mientras el archivo * .cs generado está activo, cuando necesito depurar la Preprocessed T4 Template. Después de eliminar las directivas #line, la depuración de la clase de plantilla generada funciona como se esperaba.

No

la solución ideal, pero funciona :)

Cuestiones relacionadas