Типы 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" #>
Другие вопросы по тегам