更新到 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
针对此问题的任何已知解决方法或修复方法?
答案 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上修复。已注释的解决方法有效。