在T4模板中无法识别EnvDTE类型

时间:2012-09-16 11:12:20

标签: c# t4 envdte

我正在尝试使用T4模板加快速度。我找到了以下示例(here):

<#@ 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 个答案:

答案 0 :(得分:2)

尝试像这样使用

 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;

答案 1 :(得分:2)

嗯,我认为以下内容包括

<#@ template hostspecific="True" #>

会拉动装配,但也许不会。首先,尝试将以下内容添加到模板的顶部。

<#@ Assembly Name="EnvDTE" #>

如果这不起作用,请尝试添加完整路径。对我来说,它的

<#@ Assembly Name="C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies\envdte.dll" #>

答案 2 :(得分:1)

您是否在项目中添加了对ENVDTE和ENVDTE80(90等)的引用?

答案 3 :(得分:0)

添加此行对我有用:

<#@ Assembly Name="EnvDTE" #>