code - ¿Cómo puedo usar las últimas funciones de C#v6 en las plantillas T4?
code generator c# (3)
Debe actualizar a la Actualización 2 de Visual Studio 2015 , lanzada el 30 de marzo de 2016, que introduce dicha funcionalidad. Bajo sus “Otros cambios”:
Plantillas de texto T4 mejoradas para que ahora admitan C # 6.0.
Sin embargo, la funcionalidad se rompe de nuevo en Visual Studio 2015 Update 3.
Estoy intentando ejecutar una nueva plantilla T4 en Visual Studio 2015. Sin embargo, no se compila en esta línea:
var message = $"Linked table ''{linkedTable}'' does not exist.";
El compilador informa que el carácter ''$'' es inesperado. Sin embargo, esta sintaxis debe ser válida en C # v6, de acuerdo con las nuevas pautas de la función de interpolación de cadenas .
¿Hay alguna manera de hacer que el motor de plantillas T4 use la versión más nueva de C #, aparte de compilar mi código en una biblioteca externa ?
ACTUALIZAR:
Aquí están los elementos de declaración para el archivo, como referencia:
<#@ 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" #>
Aparte del elemento SqlModelDirective
, SqlModelDirective
que esto es bastante estándar.
En Visual Studio 2017 (y probablemente 2015 también), agregar el último paquete de nuget Microsoft.Net.Compilers
al proyecto que contiene sus plantillas T4 habilitará las últimas características de C #, como cadenas interpoladas. (Acabo de hacer esto con Visual Studio 2017 15.6.2 y la versión 2.7.0 del paquete).
No puedes usar C # 6 en las plantillas de T4 en este momento, ya que no usan el último compilador.
Puede especificar las opciones del compilerOption
en el atributo compilerOption
de la directiva de template . Si se usó el último compilador, podrías usar:
<#@ template debug="false" hostspecific="false" language="C#"
compilerOptions="/langversion:6" #>
Cuando intenté esto conseguí el siguiente error:
Transformación de compilación: Opción no válida ''6'' para / langversion; debe ser ISO-1, ISO-2, 3, 4, 5 o predeterminado
ACTUALIZAR
Encontré esta discusión en el repositorio de ASP.NET en Github. Parece que el equipo de ASP.NET está buscando reemplazar T4 con Razor (lo cual no es una mala idea por cierto). Me pregunto si @davidfowl tiene más información;)
ACTUALIZACIÓN 2
David Fowler respondió en Twitter : T4 usa CodeDom, que aún no se ha actualizado para usar Roslyn. Si bien hay un paquete NuGet con proveedores de CodeDom de reemplazo , funciona solo en proyectos ASP.NET 4.x, no en T4.
Así que no hay C # 6 en T4 por ahora.