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

8

我正在尝试调试一个预处理的T4模板,但我无法进入运行预处理模板创建的类。我能够创建该类的实例,但是在调试时尝试进入时,会弹出一个新窗口,上面写着:

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

我的理解是,预处理模板可以像普通的C#类一样进行调试,这不正确吗?有没有什么特别的事情需要做才能进入由预处理模板定义的类?

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

TestPreprocessedTemplate.tt:

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

测试代码:

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

编辑 - 根据下面的建议,添加了debug="true"语句,但仍然存在相同的问题。

更新 - 我还在MSDN论坛上发布了这个问题,并收到了来自微软员工的回复,表明我上面描述的确实应该可以工作。还有其他人遇到过这个问题吗?

更新 - 在MSDN论坛的一些帮助下,看起来问题出在生成的C#类中添加的#line指令上。将它们注释掉可以让我按预期步进代码。 有没有办法防止这些指令被添加到生成的类中? 对于ASP.NET页面,您可以添加LinePragmas="false"参数,但似乎对T4模板没有任何影响。有什么想法吗?


看起来你正在使用具体的T4编辑器,这个问题很明显。如果你禁用这个编辑器,你应该会发现在预处理模板调试时,它会带你到tt文件本身的正确位置。如果你真的想要调试生成的C#/VB文件,那么Paiden在下面描述的去除#line指令的技巧是一个不错的选择。 - GarethJ
请参见相关问题 https://dev59.com/H3A85IYBdhLWcg3wF_gO - Eric J.
3个回答

2

1
更新 - 在 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模板时,只需在命令窗口中激活生成的*.cs文件,并调用rl,就能够删除#line指令。删除#line指令后,生成的模板类的调试效果符合预期。

虽不是最理想的解决方案,但它确实可行 :)


1

我也尝试过那个方法,为了确保,我又试了一遍,运行了模板并再次尝试进行调试。但问题依旧...至于这篇文章,我之前看过,我能够调试普通的t4模板,但是当我尝试调试预处理的模板时就不行了。 - JohnZoidbergMD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接