Типы EnvDTE не распознаются в шаблоне T4
Я пытаюсь освоиться с шаблонами T4. Я нашел следующий пример ( здесь):
<#@ template hostspecific="True" #>
<#@ output extension="txt" #>
<#@ include file="T4Toolbox.tt" #>
<#@ import namespace="EnvDTE" #>
<#
CodeEnum enumeration = GetEnum("ContactType.cs");
WriteLine("Found enumeration " + enumeration.Name);
foreach (CodeElement element in enumeration.Children)
{
CodeVariable value = element as CodeVariable;
if (value != null)
WriteLine("… found value " + value.Name);
}
#>
<#+
private CodeEnum GetEnum(string enumFile)
{
ProjectItem projectItem = TransformationContext.FindProjectItem(enumFile);
FileCodeModel codeModel = projectItem.FileCodeModel;
return FindEnum(codeModel.CodeElements);
}
private CodeEnum FindEnum(CodeElements elements)
{
foreach (CodeElement element in elements)
{
CodeEnum enumeration = element as CodeEnum;
if (enumeration != null)
return enumeration;
enumeration = FindEnum(element.Children);
if (enumeration != null)
return enumeration;
}
return null;
}
#>
Каким-то образом ни один из типов, находящихся в пространстве имен EnvDTE, не распознается. Я использую расширение Visual T4. Все типы EnvDTE подчеркнуты красным. Шаблон не запускается, и я получаю список ошибок, таких как:
The type or namespace ... could not be found (are you missing a using directive or assembly reference?)
Кто-нибудь знает как это решить?
4 ответа
Вы добавили ссылку на ENVDTE и ENVDTE80 (90 и т. Д.) В свой проект?
Попробуйте использовать это
DTE env = GetVSEnvironment();
....
private DTE GetVSEnvironment() {
DTE env = null;
var provider = Host as IServiceProvider;
if (provider != null) {
env = provider.GetService(typeof(DTE)) as DTE;
}
if (env == null) {
throw new InvalidOperationException("Template must be executed from Visual Studio");
}
return env;
}
теперь ты env.blablabla
например: env.Solution.FindProjectItem(Host.TemplateFile).ContainingProject;
Хм, я думаю, что следующие включают
<#@ template hostspecific="True" #>
потянул бы в сборе, а может и нет. Сначала попробуйте добавить следующее в начало вашего шаблона.
<#@ Assembly Name="EnvDTE" #>
Если это не сработает, попробуйте добавить полный путь. Для меня это
<#@ Assembly Name="C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies\envdte.dll" #>
Добавление этой строки у меня сработало:
<#@ Assembly Name="EnvDTE" #>