Подтвердить что ты не робот

T4 Получить текущий рабочий каталог решения

Я использую T4 в Visual Studio 2010, и я хочу перебирать файлы в моем решении, однако я обнаружил, что исходное поколение T4 работает в виде песочницы, а текущий рабочий каталог находится внутри визуального Studio 10 в файлах программ.

Есть ли способ ссылаться на решение, что файл T4 находится в релятивистском режиме, так что он не разбивает сборку или не работает в каком-то еще поле, которое не имеет одинаковой файловой структуры и т.д.

Спасибо

4b9b3361

Ответ 1

Вы должны установить для атрибута hostspecific значение true следующим образом:

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

Интерфейс ITextTemplatingEngineHost предоставит вам необходимую информацию.

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

Я не верю, что есть способ ссылаться на решение, но вы можете получить путь, в котором находится ваш *.tt файл, и оттуда получить другие файлы.

Чтобы загрузить файл из местоположения относительно шаблона текста, вы можете использовать это:

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

Ответ 2

Это метод, который я использую для получения каталога с базой решений:

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

Ответ 3

Вот как использовать логику JCallico, представленную в шаблоне T4, который создает 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>

Атрибут XML "filePath" будет равен директории решений Visual Studio плюс "\ MySubfolder\MyFile.exe".