Могут ли шаблоны T4 использовать одну и ту же библиотеку - PullRequest
1 голос
/ 30 апреля 2009

У меня есть библиотека, которая определяет класс

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 ]

1 голос
/ 27 апреля 2011

Вы можете сделать это, но есть проблемы с этим «рекурсивным» стилем работы, которые требуют осторожности.

В VS2010 вы можете использовать макропеременные VS, $ (SolutionDir), $ (ProjectDir) и друзей в вашей директиве <# @ assembly #>, например

<# @ assembly name = "$ (ProjectDir) $ (OutDir) ClassLibrary.dll" #>

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

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

1 голос
/ 29 октября 2009

Я не уверен, возможно ли это.

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

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

<#@ include file="Helper.tt" #>

Таким образом, вы можете определить Rate = 5 в одном центральном шаблоне, и все остальное будет ссылаться на это. Вы даже можете создать шаблон для генерации класса Class1, чтобы все находилось в одном центральном месте.

Я знаю, что это не дает прямого ответа на ваш вопрос, но я надеюсь, что это пригодится в любом случае.

0 голосов
/ 19 февраля 2010

Вы пытались опубликовать на форуме VS Extensibility на http://social.msdn.microsoft.com/Forums/en-US/vsx/threads?

...