Директива по сборке шаблона T4 - PullRequest
10 голосов
/ 27 мая 2011

У меня есть пользовательская dll, в которой есть класс, и (для простоты) есть метод, который возвращает строку.

У меня есть проект, который ссылается на указанную dll, и я хочу использовать (не предварительно обработанный) шаблон T4 в этом проекте, который вызывает указанный метод. Я пробовал это:

<#@ template debug="true" hostspecific="false" language="C#" #>
<#@ assembly name="MyDLL.dll" #>
<#@ output extension=".cs" #>
<#
    var template = new MyDLL.MyNamespace.MyClass();
        this.Write(template.Run());
#>

Я получил следующие ошибки:

Ошибка 14 Компиляция преобразования: файл метаданных 'MyDLL.dll' не найден
Ошибка 13 Пространство имен не может напрямую содержать элементы, такие как поля или методы

, даже если MyClass.Run () просто return "//hello";

Ответы [ 3 ]

8 голосов
/ 27 мая 2011

У меня была та же самая проблема только вчера, у нас есть папка Binaries уровня решения, поэтому у меня работает следующее $(SolutionDir)Binaries\Assembly.dll.

Однако, в зависимости от того, где находится сборка, вы можете использовать относительный путь проекта, используя директиву $(ProjectDir) ...

8 голосов
/ 27 мая 2011

Похоже, ваша проблема:

Ошибка преобразования трансляции: файл метаданных 'dotless.Core' не найден

Это связано с нарушением совместимости, описанным здесь:

http://weblogs.asp.net/lhunt/archive/2010/05/04/t4-template-error-assembly-directive-cannot-locate-referenced-assembly-in-visual-studio-2010-project.aspx

0 голосов
/ 15 сентября 2016

(Примечание: все это относится к VS2013. Может отличаться от других версий.)

Сначала используйте $(TargetDir), чтобы найти файл в выходном пути.

Пример: <#@ assembly name="$(TargetDir)MyDLL.dll" #>

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

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

Выход из этой ситуации заключается в том, чтобы либо временно исключить шаблон, получить проект для сборки (который будет копировать ссылки), а затем добавить его обратно; или вручную скопируйте DLL-файлы в каталог, на который они жалуются. Как только вещи строятся, они должны оставаться в строю.

(Так как генератор шаблонов запускается до копирования ссылок, я подозреваю, что возникнет аналогичная проблема, связанная с новым кодом. Если вы добавите новый код в библиотеку и используете его в своем шаблоне перед сборкой, вы застрянете из-за того, что шаблон не знает о новом коде, из-за чего он выдает ошибку, что делает вашу сборку неуспешной, поэтому он не получает новую версию, и вы снова застряли.)

(Вы также должны попадать в эту ситуацию всякий раз, когда вы чистите или перестраиваете свой проект, но у меня, похоже, такое случается не очень часто, так что может быть что-то большее, чем я понимаю.)

...