Могут ли шаблоны T4 использовать одну и ту же библиотеку
У меня есть библиотека, которая определяет класс
namespace ClassLibrary1
{
public class Class1
{
public static readonly int Rate = 5;
}
}
В ту же библиотеку я добавляю файл tt
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<#@ import namespace="ClassLibrary1" #>
<#@ assembly name="ClassLibrary.dll" #>
enum MilkRate{ Walmart=<#= Class1.Rate #>}
Я получаю сообщение об ошибке "Компиляция преобразования: файл метаданных 'ClassLibrary.dll' не найден d:\documents\visual studio 10\Projects\ConsoleApplication2\ClassLibrary1\TextTemplate1.tt"
как это решить?
[Происходит VS 2010, VS2008]
3 ответа
Я не уверен, возможно ли это.
Я думаю, что проблема, с которой я могу столкнуться, заключается в следующем: ваш шаблон генерирует код, который изменит DLL, на который он ссылается!
Одна вещь, которую вы можете сделать, это сделать так, чтобы один шаблон ссылался на другой шаблон, используя:
<#@ include file="Helper.tt" #>
Таким образом, вы могли бы определить Rate = 5
в одном центральном шаблоне, и все остальное указывает на это Вы могли бы даже создать шаблон для генерации вашего Class1
класс, так что все проводится в одном центральном месте.
Я знаю, что это не дает прямого ответа на ваш вопрос, но я надеюсь, что это пригодится в любом случае.
Вы можете сделать это, но есть проблемы с этим "рекурсивным" стилем работы, которые требуют осторожности.
В VS2010 вы можете использовать макропеременные VS, $(SolutionDir), $(ProjectDir) и друзей в вашей директиве <# @ assembly #>, например
<# @ assembly name = "$ (ProjectDir) $ (OutDir) ClassLibrary.dll" #>
Если у вас тогда есть разработчик, добивающийся чистого контроля над исходным кодом, он должен будет выполнить сборку, прежде чем сможет выполнить работающее преобразование.
Если они преобразуются первыми, преобразование завершится неудачно, тогда их сборка не удастся, и они застрянут и должны будут восстановить файлы. Это не страшно, но это может сбить с толку.
Вы пытались опубликовать на форуме VS Extensibility по адресу http://social.msdn.microsoft.com/Forums/en-US/vsx/threads?