在C#T4模板中通过DTE访问项目

时间:2012-10-18 10:05:50

标签: c# visual-studio-2012 t4 envdte

我正在尝试迭代我的所有项目(sharepoint)以将所有功能guid放入文件中。我想在它们前面加上项目名称。我的问题是DTE.Solution.Item和DTE.Solution.Projects.Item(或foreach的枚举器)不会将整数作为参数,foreach返回一个不能转换为Project的对象。

这是我的代码段:

var hostServiceProvider = (IServiceProvider) Host;
var dte = (DTE) hostServiceProvider.GetService(typeof(DTE));
var projectCount = dte.Solution.Projects.Count;

var projects = new Dictionary<string, string>();

foreach(Project dteProject in dte.Solution)
{
    var dteProject = dte.Solution.Item(i);
    projects.Add(dteProject.Name, dteProject.FullName);
}

好的 - 代码没问题 - 调试器不是! 抛出调试上下文的我的异常,但如果未附加调试器,模板将正常运行。

2 个答案:

答案 0 :(得分:12)

尝试Solution.Projects属性:

<#@ template language="C#" debug="true" hostspecific="true" #>
<#@ assembly name="Microsoft.VisualStudio.Shell.Interop.8.0" #>
<#@ assembly name="EnvDTE" #>
<#@ assembly name="EnvDTE80" #>
<#@ assembly name="VSLangProj" #>
<#@ import namespace="Microsoft.VisualStudio.Shell.Interop" #>
<#@ import namespace="EnvDTE" #>
<#@ import namespace="EnvDTE80" #>
<#@ import namespace="Microsoft.VisualStudio.TextTemplating" #>
<#@ output extension=".txt" #>
<#

var hostServiceProvider = (IServiceProvider)this.Host;
var dte = (DTE)hostServiceProvider.GetService(typeof(DTE));

foreach (Project project in dte.Solution)
{
    #>
    <#= project.Name #>
    <#
}

#>

答案 1 :(得分:2)

试试这个

        var item = dte.Solution.Projects.GetEnumerator();
        while (item.MoveNext())
        {
            var project = item.Current as EnvDTE.Project;
            if (project == null)
            {
                continue;
            }
            ...
        }