ubicacion ruta proyecto obtener net guardar getfullpath ejemplos directorios directorio como asp archivo absoluta c# visual-studio code-generation t4

c# - ruta - T4 Obtener el directorio de trabajo actual de la solución



path getfullpath (3)

Aquí le mostramos cómo usar la lógica que proporciona JCallico 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 atributo XML "filePath" será igual al directorio de soluciones de Visual Studio más "/ MySubfolder / MyFile.exe".

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

¿Hay alguna forma de hacer referencia a la solución en la que se encuentra el archivo T4 de manera relativista, para que no rompa la compilación o funcione en la caja de otra persona que no tenga la misma estructura de archivos, etc.?

Gracias


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); }


Debes establecer el atributo hostspecific del hostspecific en verdadero como tal:

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

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

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

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

Para cargar un archivo desde una ubicación relativa a la plantilla de texto, puede usar esto:

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