Come creare più file di output da un singolo modello T4 usando Tangible Editor?

Ho provato a seguire questo tutorial: http://t4-editor.tangible-engineering.com/blog/how-to-generate-multiple-output-files-from-a-single-t4-template.html

con visual studio 2015 (.Net 4.5)

Esempio di progetto con errore: http://www.filedropper.com/t4fail


Ho creato Template1.tt con la seguente fonte:

          

Ho aggiunto TemplateFileManagerV2.1.ttinclude dalla galleria di modelli al mio progetto.

Quindi ho ricevuto un errore:

‘Microsoft.VisualStudio.TextTemplating.IDebugTextTemplatingEngine’ è definito in un assembly a cui non viene fatto riferimento. È necessario aggiungere un riferimento all’assembly “Microsoft.VisualStudio.TextTemplating.Interfaces.11.0, Version = 11.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a”.

Così ho aggiunto riferimenti a

C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.VisualStudio.TextTemplating.11.0 \ v4.0_11.0.0.0__b03f5f7f11d50a3a \ Microsoft.VisualStudio.TextTemplating.11.0.dll

e

C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ Microsoft.VisualStudio.TextTemplating.Interfaces.11.0 \ v4.0_11.0.0.0__b03f5f7f11d50a3a \ Microsoft.VisualStudio.TextTemplating.Interfaces.11.0.dll

al mio progetto, ma nulla è cambiato.


L’errore era nel seguente metodo dentro .ttinclude

 public string GetTemplateContent(string templateName, TextTemplatingSession session) { string fullName = this.Host.ResolvePath(templateName); string templateContent = File.ReadAllText(fullName); var sessionHost = this.Host as ITextTemplatingSessionHost; sessionHost.Session = session; Engine engine = new Engine(); return engine.ProcessTemplate(templateContent, this.Host); } 

L’ho sostituito con

 public string GetTemplateContent(string templateName, TextTemplatingSession session) { string fullName = this.Host.ResolvePath(templateName); string templateContent = File.ReadAllText(fullName); var sessionHost = this.Host as ITextTemplatingSessionHost; sessionHost.Session = session; //Engine engine = new Engine(); return "";//engine.ProcessTemplate(templateContent, this.Host); } 

per verificare se il problema è effettivamente in dll e ottenuto:

‘Microsoft.VisualStudio.TextTemplatingA30AC8B57EFC4307E43667FCD72F5E4857F498C5224AE0D43FFC74B3A98D4FA090794EF196648D62B1BC664AFBA5EDE831067D7D1768A759EBBE83426975F7AA.GeneratedTextTransformation’ non contiene una definizione per ‘Host’ e nessun metodo di estensione ‘Host’ accettare un primo argomento di tipo ‘Microsoft.VisualStudio.TextTemplatingA30AC8B57EFC4307E43667FCD72F5E4857F498C5224AE0D43FFC74B3A98D4FA090794EF196648D62B1BC664AFBA5EDE831067D7D1768A759EBBE83426975F7AA.GeneratedTextTransformation’ potrebbe essere trovato (che le manca una direttiva using o un riferimento all’assembly?)

Sembra, che non lo sia.

Ricordo che ho trovato un modo più semplice per farlo nel 2010, ma ora, dopo aver cercato sul Web quel metodo, non sono riuscito a trovarlo di nuovo. Quindi, dopo alcuni scavi, sono riuscito a trovarlo in un vecchio repository di codice sorgente. Ecco come ho fatto allora, senza fare uso di alcun file esterno o dipendenza:

 <#@ template debug="false" hostspecific="true" language="C#" #> <#@ assembly name="System.Core" #> <#@ import namespace="System" #> <#@ import namespace="System.IO" #> <#@ output extension=".txt" #> <# for (Int32 i = 0; i < 10; ++i) { #> Content <#= i #> <# // End of file. SaveOutput("Content" + i.ToString() + ".txt"); } #> <#+ private void SaveOutput(string outputFileName) { string templateDirectory = Path.GetDirectoryName(Host.TemplateFile); string outputFilePath = Path.Combine(templateDirectory, outputFileName); File.WriteAllText(outputFilePath, this.GenerationEnvironment.ToString()); this.GenerationEnvironment.Remove(0, this.GenerationEnvironment.Length); } #> 

Si noti che non so chi sia l’autore originale di questo metodo. Se ti capita di sapere chi è, per favore lascia un commento.

<#@ template hostSpecific="true"#>

in cima .tt file .tt risolve tutto.