更新到 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/