Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

T4 Get Current Working Directory of Solution

Tags:

I am using T4 in Visual Studio 2010, and I want to iterate over the files in my solution, however I have found that T4 source generation works in a kind of a sandbox, and the current working directory is inside of the Visual Studio 10 directory in program files.

Is there a way to reference the solution the T4 file is in relativistically, so that it doesn't break the build, or works on some one else's box that doesn't have the same file structure etc?

Thanks

like image 756
aceinthehole Avatar asked Feb 10 '11 02:02

aceinthehole


3 Answers

You must set the hostspecific attribute to true like so:

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

The ITextTemplatingEngineHost interface will give you the information you need.

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

I don't believe there is a way to reference the solution, but you can get the path in which your *.tt file is and from there get other files.

To load a file from a location relative to the text template, you can use this:

this.Host.ResolvePath("relative/path.txt")
like image 143
Shiv Kumar Avatar answered Sep 23 '22 14:09

Shiv Kumar


This is the method I use to get the solution base directory:

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);
}
like image 16
JCallico Avatar answered Sep 22 '22 14:09

JCallico


Here's the how to use the logic JCallico provided in a T4 template that creates an XML file:

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

The XML attribute "filePath" will equal the Visual Studio's solution directory plus "\MySubfolder\MyFile.exe".

like image 5
Brandon S Avatar answered Sep 21 '22 14:09

Brandon S