Получить путь к указанному проекту в T4 шаблон?

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

Пример (представьте, что это ASCII-обозреватель решений):

MySolution.sln
-> MyTests.csproj (C:\a\b\c\)
----> GeneratedTests.tt (C:\a\b\c\GeneratedTests.tt)
-> MyDAL.csproj (C:\x\y\z\)
----> MyModel.edmx (C:\x\y\z\MyModel.edmx)

Как бы GeneratedTests.tt сможет получить путь к файлу для MyModel.edmx, используя ссылку на него своего проекта?

15
задан Jaxidian 23 August 2010 в 13:31
поделиться

3 ответа

Это так не работает. Вам нужно будет ссылаться на dll по пути (вы можете узнать это с помощью Host.ResolvePath и использовать тег VolatileAssembly из набора инструментов, чтобы иметь возможность перекомпилировать его без перезапуска VS) и используйте отражение для работы с моделью.

4
ответ дан 1 December 2019 в 01:10
поделиться

Вы можете использовать макросы для специальных каталогов, таких как $ (ProjectDir) , $ (SolutionDir) из шаблона, и, возможно, прочитать файл .sln или .csproj, чтобы извлечь каталог для другого проекта.

1
ответ дан 1 December 2019 в 01:10
поделиться

Этот ответ работает только в Visual Studio.

Установите свойство hostspecific для шаблона T4. Это дает вам доступ к свойству Host. Введите Host to IServiceProvider для вызова GetService(typeof(DTE)). Это позволяет просматривать содержимое решения.

<#@ template language="c#" hostspecific="true"  #>
<#@ assembly name="EnvDTE" #>
<#@ import namespace="EnvDTE" #>
These are the projects in this solution:
<#
var serviceProvider = this.Host as IServiceProvider;
var dte = serviceProvider.GetService(typeof(DTE)) as DTE;
foreach (Project p in dte.Solution.Projects)
{
#>
    <#=p.Name#> at <#=p.FullName#>
<#
}
#>

Также см. пример интерфейса ITextTemplatingEngineHost в MSDN и T4 Architecture от Oleg Synch.

15
ответ дан 1 December 2019 в 01:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: