T4预处理模板调试不起作用 – Visual Studio 2010 RTM

我正在尝试调试预处理的T4模板,我无法进入通过运行预处理模板创建的类。 我能够创建一个类的实例,但是一旦我尝试在调试时进入,就会弹出一个新窗口

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

我的理解是预处理模板可以像普通的c#类一样调试,这不正确吗? 为了能够进入由预处理模板定义的类,您需要做些什么吗?

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

TestPreprocessedTemplate.tt:

 Hello  

测试代码:

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

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

更新 – 我也在MSDN论坛上发布了这个问题,并收到了MS员工的回复,表明我上面描述的内容应该确实有效。 还有其他人遇到过这个问题吗?

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

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

oleg是我要检查的主人http://www.olegsych.com/2008/09/t4-tutorial-debugging-code-generation-files/

看起来您在模板头中缺少debug="true"项,这是调试所必需的。

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

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

调试Preprocessed T4模板时,#line指令实际上会产生问题(调试器总是搜索* .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模板时,我可以通过在生成的* .cs文件处于活动状态时在命令窗口中调用rl来删除#line指令。 删除#line指令后,调试生成的模板类将按预期工作。

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