Невозможно сослаться на сборку в шаблоне T4

У меня есть следующий код в классе тестера в моей основной сборке PocoGenerator. Эта сборка должна использовать шаблон T4 для создания POCO на основе сущностей L2S в сборке, на которую имеется ссылка (ссылка на проект), DataObjects.

var assemblyName = "DataObjects";
var dataObjects = AppDomain.CurrentDomain.Load(new AssemblyName(assemblyName));

Как бы я ни старался, я не могу заставить T4 найти сборку DataObjects. Я пробовал различные формы assembly директив, например:

<#@ assembly name="DataObjects" #>
<#@ assembly name="DataObjects, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" #>

но безрезультатно. Приведенный выше код работает в классе тестера, но не в шаблоне. Что я делаю неправильно?

ДОБАВЛЕНО: я решил эту проблему, используя абсолютный путь к сборке в местах, где я ссылаюсь на нее, директиву, а также блок функций класса, т. Е.

<#@ assembly name="C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll" #>

и

var sourceAssembly = Assembly.LoadFile(@"C:\Development\PocoGenerator\DataObjects\bin\Debug\DataObjects.dll");

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


person ProfK    schedule 08.08.2010    source источник
comment
В вашем проекте-шаблоне должна быть ссылка на проект, от которого вы зависите. Тег сборки выше выглядит правильно. И у вас также должна быть ссылка на импорт. Какое именно сообщение об ошибке вы получаете? (а что там с AppDomain? Ничего подобного делать не надо)   -  person Kirk Woll    schedule 08.08.2010
comment
Материал AppDomain позволяет мне перебирать все типы в одной из сборок, загруженных в текущий AppDomain. Это не имеет ничего общего со ссылкой на сборку для самого шаблона.   -  person ProfK    schedule 08.08.2010
comment
Да, теперь понятно. И какое именно сообщение об ошибке вы получаете?   -  person Kirk Woll    schedule 08.08.2010
comment
@ Кирк, пожалуйста, посмотрите мою последнюю правку.   -  person ProfK    schedule 09.08.2010


Ответы (4)


<#@ assembly name="$(ProjectDir)bin\Debug\ProofOfConcept.dll" #>

Удачного кодирования!

person Eric    schedule 14.12.2010
comment
Обратите внимание, что это функция только для VS2010. - person GarethJ; 16.01.2011
comment
Или даже лучше: <#@ assembly name="$(ProjectDir)$(OutDir)$(TargetFileName)" #> - person Jürgen Steinblock; 08.02.2011
comment
Самый простой: <#@ Assembly name="$(TargetPath)" #> - person pylover; 21.07.2012
comment
Разве это не применимо только в том случае, если проект уже построен? Я хочу иметь возможность использовать сборку, на которую указывает ссылка, для генерации кода до создания проекта. - person Sean Glover; 08.10.2013
comment
Я нашел решение, которое хорошо работает в моем случае. Создайте другой проект в своем решении с теми же ссылками (которые могут быть обновлены с помощью NuGet), обновите порядок сборки, настройте его вывод сборки на какое-то детерминированное (например, $ (SolutionDir) \ .. \ MyT4Assemblies) и создайте любой проект с ваш шаблон T4 зависит от того, создается ли он первым. stackoverflow.com/a/9354103/895309 - person Sean Glover; 08.10.2013
comment
@Garethj, что мне делать с vs2013? - person machinarium; 11.06.2015
comment
Извините @machinarium, не понимаю ваш комментарий. - person GarethJ; 14.07.2015

Чтобы ссылаться на сборку в шаблоне T4 в VS2010, у вас есть несколько вариантов:

  1. GAC ваши сборки и используйте ссылку на пространство имен или полное имя типа
  2. Используйте жестко запрограммированный полностью квалифицированный путь UNC
  3. Скопируйте сборку в Visual Studio «Папка общедоступных сборок» и используйте ссылку на пространство имен или полное имя типа.
  4. Используйте или определите переменную среды Windows для создания полностью определенного пути UNC.
  5. Используйте макрос Visual Studio для создания полностью квалифицированного пути UNC.

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

Очень хороший пост по этой теме: Ошибка шаблона T4 - директиве сборки не удается найти сборку, на которую имеется ссылка, в проекте Visual Studio 2010.

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

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

Подробнее об этом: Что нового в T4 в Visual Studio 2010

person Peter Stegnar    schedule 11.01.2011
comment
+1 за то, что ссылка на проект больше не используется, это меня убивало! - person dbones; 09.10.2012
comment
@Peter Stegnar Я задаю связанный вопрос здесь: stackoverflow.com/questions/13838142/, не могли бы вы проверить это - person Saeid; 12.12.2012

У меня возникла аналогичная проблема, когда я попытался включить Less Css for .NET в свой веб-проект.

В итоге я скопировал сборку в корневую папку моего проекта и включил ее в качестве ссылки в сам проект. Затем я добавил следующие строки в файл .tt:

<#@ assembly name="dotless.Core.dll" #>

<#@ import namespace="dotless.Core" #>
<#@ import namespace="dotless.Core.configuration" #>

Я уверен, что что-то подобное должно работать и с вашей сборкой ...

person Regent    schedule 09.08.2010

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

попробуйте напрямую включить рассматриваемую сборку в вашу основную сборку - и учтите, что вам может потребоваться написать инструкции по сборке, чтобы переместить ее в «ожидаемое» место - в то время как nusiance, она должна превзойти необходимость жесткой привязки пути.

YMMV

person Mark Mullin    schedule 09.08.2010