T4 Получить текущий рабочий каталог решения - PullRequest
17 голосов
/ 10 февраля 2011

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

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

Спасибо

Ответы [ 3 ]

31 голосов
/ 10 февраля 2011

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

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

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

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

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

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

this.Host.ResolvePath("relative/path.txt")
10 голосов
/ 24 июля 2015

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

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 голосов
/ 04 декабря 2015

Вот как использовать логику 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".

...