T4包括安装VS2013 Update 3后损坏的指令

时间:2014-08-19 07:29:24

标签: visual-studio-2013 include t4

更新到 Visual Studio 2013 Update 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

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

1 个答案:

答案 0 :(得分:4)

找到了根本原因。

实现接口ITextTemplatingEngineHost时,要实现的方法之一是:

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

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

相对于documentation,如果模板不是基于文件系统的,则该值可以为空。参见文档参考:

  

位置 类型:字符串
  包含该位置的String   获得的文本。如果主机在注册表中搜索的位置   包含文件或主机默认搜索多个位置,   主机可以在此返回包含文件的最终路径   参数。如果文件可以,主持人可以将位置设置为清空   找不到或主机不是基于文件系统的

然而,对于Update 3,某些内容已更改且T4引擎检查并期望location参数为非空文件路径。 String.Empty值会导致原始注释异常。

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

感谢@rubenjmarrufo寻找错误。

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