2010-05-28 30 views
10

Estoy tratando de ejecutar una plantilla T4 que abre un archivo XML y lo usa para generar un artefacto de código. Sin embargo, estoy recibiendo el mensaje de error al intentar ejecutar una plantilla T4 similar a la de abajo¿Cómo abrir un archivo en una ruta relativa usando T4?

<#@ template debug="false" hostspecific="false" language="C#" #> 
<#@ assembly name="System.Xml.dll" #> 
<#@ assembly name="System.Xml.Linq.dll" #> 
<#@ import namespace="System.IO" #> 
<#@ import namespace="System.Xml" #> 
<#@ import namespace="System.Xml.Linq" #> 
<#@ output extension=".cs" #> 
namespace ConsoleApplication1 
{ 
<# XElement fragment = XElement.Load("data.xml"); #> 
... 

Visual Studio 2010 lista de errores se muestra el siguiente mensaje de

Ejecución de transformación: Sistema .IO.FileNotFoundException: no se pudo encontrar el archivo 'C: \ Archivos de programa \ Microsoft Visual Studio 10.0 \ Common7 \ IDE \ data.xml'.

Está intentando abrir el archivo en la ruta donde se ejecuta la herramienta personalizada TextTemplateFileGenerator. Me gustaría abrir el archivo en relación con la ruta de mi proyecto, porque otros desarrolladores en mi equipo usan diferentes estructuras de carpetas. ¿Alguien sabe si es algo posible de lograr?

Respuesta

20

Cambie la opción específica del alojamiento en la directiva de la plantilla a "verdadero" y llame a Host.ResolvePath ("data.xml").

+0

¡Funcionó, gracias! –

+2

Por lo que vale, esto se documenta aquí: http://msdn.microsoft.com/en-us/library/bb126478.aspx – MrSlippers

0

Tuve un problema similar pero Host.ResolvePath no funcionó porque mi ruta relativa contenía ".. \ ..." en ella. Lo solucioné haciendo esto:

string ttpath = this.Host.TemplateFile; 
string resolvedPath = Path.GetFullPath(Path.GetDirectoryName(ttpath) + @"..\..\<Path To File>"); 
Cuestiones relacionadas