У меня есть решение, в котором есть несколько проектов. Я хотел бы создать несколько шаблонов 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, используя ссылку на него своего проекта?
Это так не работает. Вам нужно будет ссылаться на dll по пути (вы можете узнать это с помощью Host.ResolvePath
и использовать тег VolatileAssembly
из набора инструментов, чтобы иметь возможность перекомпилировать его без перезапуска VS) и используйте отражение для работы с моделью.
Вы можете использовать макросы для специальных каталогов, таких как $ (ProjectDir)
, $ (SolutionDir)
из шаблона, и, возможно, прочитать файл .sln или .csproj, чтобы извлечь каталог для другого проекта.
Этот ответ работает только в 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.