Подтвердить что ты не робот

Нельзя ссылаться на сборку в шаблоне 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");

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

  • GAC ваши сборки и используйте ссылку на пространство имен или полностью квалифицированное имя типа
  • Использовать жестко закодированный путь с полной квалификацией UNC
  • Скопируйте сборку в Visual Studio "Public Assemblies Folder" и используйте ссылку на пространство имен или полное имя типа.
  • Использовать или определять переменную среды Windows для создания полностью квалифицированного UNC-пути.
  • Используйте макрос Visual Studio для создания полностью квалифицированного UNC-пути.

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

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

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

YMMV