В нашей компании есть устаревшая система, которая в значительной степени зависит от T4, и сотрудник, который ее разработал, ушел. У нас он работал нормально, однако недавно некоторые разработчики обновились до VS2015. Преобразования T4 перестали работать для них (с ошибкой, подобной указанной ниже). Посмотрел, хотя были ссылки на Microsoft.VisualStudio.TextTemplating.12.0.dll
. Они изменили ссылки на «14», и все у них заработало. Однако тот же проект, совместно используемый другими разработчиками на VS2013, больше не работал с ошибкой:
Компиляция преобразования: тип «Microsoft.VisualStudio.TextTemplating.TextTransformation» определен в сборке, на которую нет ссылок. Вы должны добавить ссылку на сборку «Microsoft.VisualStudio.TextTemplating.14.0, версия = 14.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a».
Можете ли вы запустить T4 в том же проекте, который открыт как в VS2013, так и в VS2015? Одно замечание: старый сотрудник сделал зависимую сборку, из которой были получены все TextTransformations (она также предоставляет помощники, которые используются в файлах *.tt). К сожалению, он использовал интерфейс, присутствующий только в Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll
, так что старая ссылка перетаскивается. Не уверен, способствует это или нет. Но в основном вот суть:
Когда все разработчики работали на VS2013, все работало и ссылки были:
Microsoft.VisualStudio.TextTemplating.12.0.dll
Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll
Microsoft.VisualStudio.TextTemplating.VSHost.12.0.dll
Затем, когда некоторые перешли на vs2015, единственным способом заставить его работать было заменить 12.0 * dll на 14.0, но затем разработчики vs2013 перестали работать.
ОБНОВЛЕНИЕ
Возможно, я не разъяснил нашу полную установку. У нас есть 20-30 файлов *.tt в отдельном проекте, который включен в решение с проектом, к которому будут применены преобразования текста.
У нас есть вспомогательная библиотека Extensibility.CodeGeneration.dll (это также относится к файлам Microsoft.VisualStudio.TextTemplating.N.dll), в которой есть несколько статических вспомогательных функций, а также базовые классы, производные от Microsoft.VisualStudio.TextTemplating.TextTransformation.
Проект 'templates', содержащий все файлы *.tt, каждый .tt файл, использует статические методы из нашей вспомогательной dll. Он также ссылается на все те же библиотеки Microsoft.VisualStudio..
В каждом файле *.tt у нас есть что-то похожее на это, где AreaTemplate — это класс, определенный в самом файле *.tt и производный либо от Microsoft.VisualStudio.TextTemplating.TextTransformation, либо от одного из открытые базовые классы в нашей вспомогательной dll.
var template = new AreaTemplate { Settings = settings, Area = area, Layouts = layouts }; Написать(шаблон.TransformText());
В комментариях спросили, как я получил/использовал «хост». При поиске по коду у нас есть несколько общих сценариев (все они выполняются внутри вспомогательной dll). В каждом экземпляре хост имеет тип
ITextTemplatingEngineHost
.
Дело 1:
var dte = (EnvDTE.DTE)( (IServiceProvider)host ).GetService( typeof( EnvDTE.DTE ) );
Случай 2:
var hostServiceProvider = (IServiceProvider)host;
Учитывая № 3 выше, я думаю, что мне должен ссылаться на библиотеки DLL Microsoft.TextTemplating (а не только на библиотеку Interfaces) из-за использования/представления класса TextTransformation.
Кроме того, если я изменю ссылки как в моем проекте «Помощник», так и в проекте «Шаблоны» на 12.0... в vs2015, я получаю сообщение об ошибке «вы должны добавить ссылку на 12.0»... У меня есть ссылки на это в обоих применимых ( в моих глазах) проекты... не уверен, почему VS говорит мне добавить его. Я попытался добавить явную ссылку в файл *.tt, используя
<#@ assembly Name="$(ProjectDir)..\..\Assemblies\Microsoft.VisualStudio.TextTemplating.12.0.dll" #>
Но потом я получил ошибку
Тип «Microsoft.VisualStudio.TextTemplating.TextTransformation» существует как в «c:\BTR\Source\Assemblies\Microsoft.VisualStudio.TextTemplating.12.0.dll», так и в «c:\Windows\Microsoft.NET\assembly\GAC_MSIL\Microsoft». .VisualStudio.TextTemplating.14.0\v4.0_14.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.TextTemplating.14.0.dll'
Это похоже на скрытую/неявную ссылку на последний Texttemplating, уже встроенный в VS??
Не уверен, что наша установка была более сложным способом достижения нашей первоначальной цели, но я не думаю, что смогу раскрутить ее и изменить, если мы делаем это неправильно.
Учитывая нашу настройку, дайте мне знать, если вы думаете, что я застрял или нет. Я пытался выяснить «условия» в MSBuild, чтобы помочь поддерживать обе Visual Studio, но не смог добиться успеха.
Заранее спасибо.