2015-09-10 12 views
16

che sto cercando di eseguire un nuovo modello T4 in Visual Studio 2015. Tuttavia non riesce a compilare in questa linea:Come posso utilizzare le ultime funzionalità di C# v6 nei modelli T4?

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

Il compilatore segnala che carattere il '$' è inaspettato. Questa sintassi dovrebbe tuttavia essere valida in C# v6, in base alle nuove linee guida sulle funzioni string interpolation.

C'è un modo per fare in modo che il motore di template T4 utilizzi la versione C# più recente, oltre a compilare il mio codice in una libreria esterna?

UPDATE:

Qui ci sono gli elementi di dichiarazione per il file, come riferimento:

<#@ 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" #> 

A parte l'elemento SqlModelDirective questo è abbastanza standard penso.

+1

puoi pubblicare il "resto" del T4? L'inizio di solito ha direttive che definiscono la lingua, il collegamento, ecc. – Eris

+1

Puoi usare altre caratteristiche di C# 6 in T4? L'interpolazione delle stringhe non funziona sulle pagine Razor anche se funzionano altre funzioni. Forse è lo stesso bug in T4. Sia Razor che T4 sono convertiti in codice C# prima della compilazione. Un errore in quella conversione potrebbe generare il codice C# errato quando si utilizza l'interpolazione delle stringhe –

+0

@Eris I ha aggiornato il post. – Crono

risposta

13

Al momento non è possibile utilizzare C# 6 nei modelli T4 poiché non utilizzano l'ultimo compilatore.

È possibile specificare le opzioni del compilatore nell'attributo compilerOption della direttiva template. Se è stata utilizzata l'ultima compilatore, è possibile utilizzare:

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

Quando ho provato questo ho ottenuto il seguente errore:

Compiling transformation: Invalid option '6' for /langversion; must be ISO-1, ISO-2, 3, 4, 5 or Default

UPDATE

Trovato this discussion sul repository ASP.NET su Github. Sembra che il team ASP.NET stia cercando di sostituire T4 con Razor (che è non una cattiva idea BTW). Mi chiedo se @davidfowl ha più informazioni;)

UPDATE 2

David Fowler responded on Twitter - T4 utilizza CodeDom che non è stato aggiornato per utilizzare Roslyn ancora. Mentre è un pacchetto NuGet con replacement CodeDom providers, funziona solo su progetti ASP.NET 4.x, non su T4.

Quindi non C# 6 in T4 per ora.

+0

Immagino che questo significhi per il momento che devo attenermi a 'string.Format' ... uomo, che fa male! Tuttavia, ho avuto modo di conoscere l'attributo 'compilerOptions'. È qualcosa. Grazie mille! – Crono

10

È necessario eseguire l'aggiornamento a Visual Studio 2015 Update 2, rilasciato il 30 marzo 2016, che introduce tale funzionalità. Sotto le sue “altre variazioni”:

Enhanced T4 text templates so that they now support C# 6.0.

Tuttavia, la funzionalità è rotto di nuovo in Visual Studio 2015 Aggiornamento 3.

+0

CTP è di dimensione 5 GB: O, è come se fossi di nuovo scaricato MSVS 2015: S, pensavo fosse solo l'aggiornamento delle dimensioni intorno a 20-50 mb: S –

+1

l'aggiornamento 2 è arrivato con il promesso C# 6 in t4 https://www.visualstudio.com/en-us/news/vs2015-update2-vs.aspx – TKharaishvili

+0

@GwynBleidd: Grazie per l'aggiornamento. Ho incorporato il nuovo link nella risposta. – Douglas

Problemi correlati