我正在尝试使用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?)
有谁知道如何解决这个问题?
答案 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" #>