3

我正在尝试跟上 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

4 回答 4

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;

于 2012-09-16T11:36:33.777 回答
2

嗯,我认为以下包括

<#@ template hostspecific="True" #>

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

<#@ Assembly Name="EnvDTE" #>

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

<#@ Assembly Name="C:\Program Files (x86)\Common Files\microsoft shared\MSEnv\PublicAssemblies\envdte.dll" #>
于 2012-09-17T13:07:36.007 回答
2

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

于 2012-09-19T14:52:23.640 回答
0

添加这一行这对我有用:

<#@ Assembly Name="EnvDTE" #>
于 2015-04-13T04:27:13.417 回答