Не может ссылаться на сборку в шаблоне T4 - PullRequest
30 голосов
/ 08 августа 2010

У меня есть следующий код в классе тестера в моей основной сборке, 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");

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

Ответы [ 4 ]

54 голосов
/ 14 декабря 2010
<#@ assembly name="$(ProjectDir)bin\Debug\ProofOfConcept.dll" #>

Счастливого кодирования!

14 голосов
/ 11 января 2011

Для ссылки на сборку в шаблоне 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

1 голос
/ 09 августа 2010

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

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

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

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

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

0 голосов
/ 09 августа 2010

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

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

YMMV

...