3

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

4 に答える 4

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

このように使ってみてください

 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

ENVDTE および ENVDTE80 (90 など) への参照をプロジェクトに追加しましたか?

于 2012-09-19T14:52:23.640 に答える
0

この行を追加すると、これがうまくいきました:

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