T4预处理模板调试不工作 - Visual Studio 2010 RTM

问题描述:

我试图调试一个预处理的T4模板,我无法进入通过运行预处理模板创建的类。我可以创建类的一个实例,但只要我尝试着进入调试阶段,就会弹出一个新窗口,说T4预处理模板调试不工作 - Visual Studio 2010 RTM

没有可用的源代码。没有可用于当前位置的源代码。

我的理解是,预处理模板可以调试,就像一个正常的C#类,这是不正确的?有什么特别的,你需要做的,以便能够进入预处理模板定义的类?

这是一个非常简单的模板,并调用代码,我有遇到问题:

TestPreprocessedTemplate.tt:

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

测试代码:

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

编辑 - 已添加根据下面的建议debug =“true”语句,仍然有同样的问题。

更新 - 我也贴在MSDN论坛上这个问题,并收到了来自该指示的是什么如上所述的确应该工作MS员工响应。任何人都遇到过这个问题?

更新 - 在MSDN论坛的帮助下,看起来问题在于#line指令被添加到生成的c#类中。将它们评论出来,可以让我像预期的那样逐步完成代码。 有没有办法阻止这些指令被添加到生成的类中?使用ASP.NET页面,您可以添加LinePragmas =“false”参数,但对T4模板没有任何影响。有任何想法吗?

+0

这听起来像您使用的是有形的T4编辑器,它表现出了这个问题。如果你禁用了这个编辑器,你会发现调试一个预处理模板会把你带到tt文件本身的正确位置。 如果你真的想调试生成的C#/ VB文件,那么Paiden用于删除下面介绍的#line指令的技术是一个不错的方法。 – GarethJ 2011-09-21 23:48:47

+0

查看相关问题http://stackoverflow.com/q/2945450/141172 – 2012-07-24 03:33:54

看起来你错过了调试所需的模板头的debug="true"项。

另外我会快速浏览以下博客文章,其中详细介绍了T4模板调试。

+0

我曾尝试过,并且只是为了确保我再次尝试了它,运行了模板并尝试再次进行调试。同样的问题... 至于文章,我曾经遇到过,我可以调试一个正常的t4模板,但是当我尝试调试预处理模板时,我无法做到。 – user423293 2010-08-17 20:23:02

在Visual Studio 2010中,你需要调用Debugger.Break前Debugger.Launch()()。

奥列格是主我查欧http://www.olegsych.com/2008/09/t4-tutorial-debugging-code-generation-files/

更新 - 从MSDN论坛一些帮助,它看起来像问题是与被添加到生成的C#类#line指令。将它们评论出来,可以让我像预期的那样逐步完成代码。有什么办法可以防止这些指令被添加到生成的类中吗?用ASP。NET页面中,您可以添加LinePragmas =“false”参数,但对T4模板没有任何影响。有任何想法吗?

#line指令调试时预处理的 T4模板(调试器始终搜索的* .TT文件,而不是生成的* cs文件),实际产生的问题。我无法找到任何转换#line指令生成的选项。所以我用下面的VisualStudio宏摆脱他们的

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

我总是在命令窗口

alias rl Macros.MyMacros.Module1.RemoveLineDirectives 

所以我能去除内分配宏一些简短的命令当我需要调试预处理的 T4模板时,通过在命令窗口中简单地调用rl,生成的* .cs文件处于活动状态,执行#line指令。删除#line指令后,调试生成的模板类将按预期工作。

不是理想的解决方案,但它的工作原理:)