2011-02-10 9 views
16

Estoy usando T4 en Visual Studio 2010, y quiero iterar sobre los archivos en mi solución, sin embargo, he encontrado que la generación de fuentes T4 funciona en una especie de entorno limitado y el actual el directorio de trabajo está dentro del directorio de Visual Studio 10 en los archivos de programa.T4 Obtener el directorio de trabajo actual de la solución

¿Hay alguna forma de referenciar la solución del archivo T4 de forma relativista, para que no rompa la construcción, o trabaje en alguna otra caja que no tenga la misma estructura de archivos, etc.?

Gracias

Respuesta

26

debe establecer el atributo hostspecific a cierto modo:

<#@ template language="C#" hostspecific="True" #> 

La interfaz ITextTemplatingEngineHost le dará la información que necesita.

<#= this.Host.ResolveParameterValue("-", "-", "projects") #> 

No creo que hay una manera de hacer referencia a la solución, pero se puede obtener la ruta en la que el archivo es *.tt y desde allí llegar a otros archivos.

Para cargar un archivo desde una ubicación con respecto a la plantilla de texto, puede utilizar esto:

this.Host.ResolvePath("relative/path.txt") 
+2

Gracias Shiv! Terminé usando this.Host.TemplateFile, que apunta directamente a la plantilla y se ejecutó desde allí. – aceinthehole

+0

@aceinthehole, gracias por los comentarios! –

+2

Puede obtener la Solución directamente cargando el DTE: http://stackoverflow.com/questions/12952110/accessing-projects-via-dte-inc-c-sharp-t4-template –

9

Este es el método que utilizo para obtener el directorio base de la solución:

public string GetSolutionDirectory() 
{ 
    var serviceProvider = this.Host as IServiceProvider; 
    var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; 
    return System.IO.Path.GetDirectoryName(dte.Solution.FullName); 
} 
4

Aquí la forma de utilizar la lógica JCallico proporciona en una plantilla T4 que crea un archivo XML:

<#@ template debug="false" hostspecific="true" language="C#" #><# /* hostspecific must be set to "true" in order to access Visual Studio project properties. */ #> 
<#@ assembly name="System.Core" #> 
<#@ import namespace="System.Text" #> 
<#@ output extension=".xml" #> 
<#@ assembly name="EnvDTE" #><# /* This assembly provides access to Visual Studio project properties. */ #> 
<# 
    var serviceProvider = this.Host as IServiceProvider; 
    var dte = serviceProvider.GetService(typeof(EnvDTE.DTE)) as EnvDTE.DTE; 
    var solutionDirectory = System.IO.Path.GetDirectoryName(dte.Solution.FullName); 
#> 
<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <mySetting filePath="<#= solutionDirectory #>\MySubfolder\MyFile.exe" /> 
</configuration> 

el att XML ribute "filePath" será igual al directorio de soluciones de Visual Studio más "\ MySubfolder \ MyFile.exe".

Cuestiones relacionadas