如何在T4模板中使用c# v6的最新特性?

本文关键字:v6 最新 T4 | 更新日期: 2023-09-27 18:12:04

我试图在Visual Studio 2015中运行一个新的T4模板。但是在这一行编译失败:

var message = $"Linked table '{linkedTable}' does not exist.";

编译器报告'$'字符是意外的。然而,根据新的字符串插值特性指南,这种语法在c# v6中应该是有效的。

是否有一种方法可以使T4模板引擎使用较新的c#版本,而不是在外部库中编译我的代码?

更新:

下面是该文件的声明元素,作为参考:

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".sql" #>
<#@ SqlModelDirective processor="SqlModelDirectiveProcessor" #>
<#@ import namespace="System" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="Microsoft.SqlServer.Dac" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ import namespace="Microsoft.SqlServer.Dac.Model" #>

除了SqlModelDirective元素,我认为这是相当标准的

如何在T4模板中使用c# v6的最新特性?

你现在不能在T4模板中使用c# 6,因为它们不使用最新的编译器。

你可以在模板指令的compilerOption属性中指定编译器选项。如果使用最新的编译器,可以使用:

<#@ template debug="false" hostspecific="false" language="C#" 
    compilerOptions="/langversion:6" #>

当我尝试这个时,我得到了以下错误:

正在编译转换:/langversion的无效选项'6';必须为ISO-1、ISO-2、3、4、5或Default

在ASP上找到了这个讨论。. NET存储库。似乎ASP。. NET团队正在寻找用Razor取代T4(顺便说一句,这是而不是一个坏主意)。不知道@davidfowl是否有更多信息;)

更新2

David Fowler在Twitter上回应- T4使用CodeDom,但尚未更新为使用Roslyn。虽然一个NuGet包与替代CodeDom提供程序,它只在ASP上工作。净4。x项目,而不是T4。

所以T4中现在没有c# 6

您应该升级到2016年3月30日发布的Visual Studio 2015 Update 2,它引入了这些功能。在"其他更改"下:

增强T4文本模板,使它们现在支持c# 6.0。

然而,在Visual Studio 2015 Update 3中,该功能再次中断。

在Visual Studio 2017(也可能是2015)中,将最新的Microsoft.Net.Compilers nuget包添加到包含T4模板的项目中,将启用最新的c#功能,如插值字符串。(我刚刚使用Visual Studio 2017 15.6.2和2.7.0版本的软件包完成了此操作)。

这在Visual Studio 2019中不适合我,所以我诉诸于创建一个单独的项目,我用汇编指令引用。本质上,程序集是一个类特征块