无法在 VS2017 上转换 T4 模板

Posted

技术标签:

【中文标题】无法在 VS2017 上转换 T4 模板【英文标题】:Cannot transform T4 templates on VS2017 【发布时间】:2018-12-05 08:28:18 【问题描述】:

我已经能够在 VS2015 和 VS2017 上转换 T4 模板,直到我更换了故障计算机并在新设备上安装了 VS2017。 p>

我总是得到错误:

严重性代码描述项目文件行抑制状态 错误 尝试编译转换代码时引发异常。引发了以下异常: System.IO.FileNotFoundException:找不到文件“C:\WINDOWS\system32\Microsoft.VisualStudio.Shell”。 文件名:'C:\WINDOWS\system32\Microsoft.VisualStudio.Shell' 在 System.IO.__Error.WinIOError(Int32 错误代码,字符串可能全路径) 在 System.IO.FileStream.Init(字符串路径、FileMode 模式、FileAccess 访问、Int32 权限、Boolean useRights、FileShare 共享、Int32 bufferSize、FileOptions 选项、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean useLongPath、Boolean checkHost) 在 System.IO.FileStream..ctor(字符串路径、FileMode 模式、FileAccess 访问、FileShare 共享) 在 Roslyn.Utilities.FileUtilities.OpenFileStream(字符串路径) 在 Microsoft.CodeAnalysis.MetadataReference.CreateFromFile(字符串路径,MetadataReferenceProperties 属性,DocumentationProvider 文档) 在 Microsoft.VisualStudio.TextTemplating.CompilerBridge.c.<.ctor>b__15_0(String x) 在 System.Linq.Enumerable.WhereSelectListIterator2.MoveNext() at System.Linq.Enumerable.<UnionIterator>d__671.MoveNext() 在 System.Linq.Enumerable.d__671.MoveNext() at System.Linq.Buffer1..ctor(IEnumerable1 source) at System.Linq.Enumerable.ToArray[TSource](IEnumerable1 源) 在 System.Collections.Immutable.ImmutableArray.CreateRange[T](IEnumerable1 items) at Microsoft.CodeAnalysis.ImmutableArrayExtensions.AsImmutableOrEmpty[T](IEnumerable1 项) 在 Microsoft.CodeAnalysis.Compilation.ValidateReferences[T](IEnumerable1 references) at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.WithReferences(IEnumerable1 引用) 在 Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CommonWithReferences(IEnumerable1 newReferences) at Microsoft.VisualStudio.TextTemplating.CompilerBridge.PrepareNewCompilation() at Microsoft.VisualStudio.TextTemplating.CompilerBridge.Compile() at Microsoft.VisualStudio.TextTemplating.TransformationRunner.Compile(String source, String inputFile, IEnumerable1 引用,布尔调试,SupportedLanguage 语言,String compilerOptions) 1

我在 Visual Studio 安装程序中启用了“文本模板转换”。

我尝试将 DLL 从 C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\Common7\IDE\PublicAssemblies 复制到 system32,但没有成功。

我还尝试使用gacutil -i 注册 DLL,但没有成功。

有什么想法吗?

【问题讨论】:

FileNotFoundException 可能会因缺少依赖项或静态对象的构造函数抛出而发生。首先是IMO更有可能。首先,使用例如sysinternals 进程监视器,它会告诉你哪个 DLL 没有找到。其次,运行带有调试器的命令行转换工具,该工具是C:\Program Files (x86)\Common Files\microsoft shared\TextTemplating\14.0\TextTransform.exe,设置为在 C++ 和 SEH 异常时中断。 【参考方案1】:

原来我的一个模板引用了Microsoft.VisualStudio.Shell

但 VS2017 仅附带一个名为 Microsoft.VisualStudio.Shell.15.0 的较新版本。

更改 .tt 中的引用后,问题就消失了。

【讨论】:

我也可以通过安装我从微软下载的 VS 2015 隔离 shell 来解决这个问题:visualstudio.microsoft.com/vs/older-downloads/isolated-shell

以上是关于无法在 VS2017 上转换 T4 模板的主要内容,如果未能解决你的问题,请参考以下文章

MSBuild 支持 Visual Studio 2017 RTM 中的 T4 模板

T4模板之文本模板

使用T4模板动态生成邮件内容并储存到任意位置

T4模板:将现有文件转换为运行时模板

构建时 T4 转换的产品仅在下一个构建中使用

PetaPoco的T4模板报错的问题