更新到 Visual Studio 2013 更新 3 后, T4 模板 中的以下代码中断。

<#@ include file="../File1.tt" #>

它在所有以前版本的 VS 中都按预期工作。
通过此更新,所有变体:
<#@ include file="../File1.tt" #>
<#@ include file="..\File1.tt" #>
<#@ include file="..\\File1.tt" #>

失败并出现以下错误:
There was an error loading the include file '..\\File1.tt'. The transformation will not    be run. The following Exception was thrown:
System.ArgumentException: The path is not of a legal form.
  at System.IO.Path.NormalizePath(String path, Boolean fullCheck, Int32 maxPathLength, Boolean expandShortPaths)
  at System.IO.Path.GetFullPathInternal(String path)
  at System.IO.Path.GetFullPath(String path)
  at Microsoft.VisualStudio.TextTemplating.Engine.VisitedFiles.Visit(String fileLocation)
  at Microsoft.VisualStudio.TextTemplating.Engine.ProcessIncludeDirective(Directive directive, ITextTemplatingEngineHost host, VisitedFiles includedFiles) in line: 234 in file: C:\...\mytemplate.tt

任何已知的解决方法或修复此问题?

最佳答案

找到根本原因。

在实现 ITextTemplatingEngineHost 接口(interface)时,要实现的方法之一是:

public bool LoadIncludeText(
              string requestFileName, out string content, out string location)

VS2013 Update 3 之前的所有先前版本中,location 参数中返回有效文件名作为输出不是必需的。事实上,我们发送 string.Empty

因此,如果模板不是基于文件系统的,则 documentation 的值可以为空。请参阅文档引用:



然而,在更新 3 中,有些事情发生了变化,T4 引擎检查并期望 location 参数为非空文件路径。 String.Empty 值导致原始注释异常。

作为临时解决方法:在实现 location 时将有效文件名传递给 LoadIncludeText 方法上的 ITextTemplateEngineHost 参数可避免异常。

感谢 @rubenjmarrufo 寻找错误。

更新: 微软确认的错误。它将在更新 4 上修复。注释的解决方法是有效的。

关于visual-studio-2013 - 安装 VS2013 Update 3 后 T4 包含指令损坏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25377848/

10-13 06:51