2015-01-22 1 views
4

Независимо от того, какой метод используется для указания файла в директиве сборки, механизм T4 не может найти указанный файл.Директива T4 Assembly не может найти указанный файл

<#@ assembly name="$(SolutionDir)packages\TestPackage\lib\net45\Test.dll"#> 

или < # имя @ сборка = "C: \ test.dll" #>

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

Errors were generated when initializing the transformation object. The transformation will not be run. The following Exception was thrown: 
System.IO.FileNotFoundException: Could not load file or assembly ‘Test, Version=1.0.1.0, Culture=neutral, PublicKeyToken=null’ or one of its dependencies. The system cannot find the file specified. 

с указанием недостающей зависимости. Для сборки нет зависимостей.

Почему двигатель T4 не может найти мою сборку?

ответ

6

Когда сборка была упакована, были внешние ссылки на EnvDTE или другие типы взаимодействия COM. Когда доступ к Interop EnvDTE (или другому COM) осуществляется в шаблоне T4, он пытается разрешить ссылку EnvDTE, и он разрешит сборку, пытающуюся загрузить. Вот откуда исходит исключение из файла, круговая ссылка. Это вызвано вложением ссылок типа interop в сборку (по умолчанию по соображениям производительности).

Dave Sexton found this issue 5 years ago:

Более конкретно, это TypeOf (DTE), что вызывает Visual Studio, чтобы попытаться загрузить мою сборку. Моя сборка - сборка .NET 4.0, и по умолчанию ссылка на сборку автоматизации envdte была добавлена ​​с включенной функцией NoPIA. Это заставляет компилятор вставлять типы interop envdte в мою сборку. Поэтому typeof (DTE) разрешает тип DTE в моей сборке, что заставляет Visual Studio требовать загрузки моей сборки для разрешения типа DTE!

Для решения проблемы вы должны отключить внедрение типов взаимодействия для связанных сборок COM.

  1. Откройте папку Ссылки для моего проекта (Visual Studio 2010, .NET 4.0).
  2. Для каждой ссылки на узел автоматизации; например, envdte, envdte80, vslangproj, vslangproj2, vslangproj80 и т. д.
  3. Выберите ссылку и откройте окно «Свойства».
  4. Изменить значение «Вставить тип взаимодействия» в значение «Неверно».

Восстановите первоначальную сборку и попытайтесь ее загрузить.

+0

Интересная информация. – FuleSnabel

+0

Удивительный, я никогда не понимал этого. Благодаря! – Alex