9

現在、すべてのプロジェクト (sharepoint) を繰り返し処理して、すべての機能ガイドをファイルに取得しようとしています。そこにプロジェクト名をプレフィックスとして付けたいと思います。私の問題は、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);
}

わかりました - コードは問題ありません - デバッガはそうではありません! 私の例外はデバッグコンテキストでスローされましたが、デバッガーがアタッチされていない場合、テンプレートは正常に実行されます。

4

2 に答える 2

14

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 #>
    <#
}

#>
于 2012-10-18T10:14:45.767 に答える
2

これを試して

        var item = dte.Solution.Projects.GetEnumerator();
        while (item.MoveNext())
        {
            var project = item.Current as EnvDTE.Project;
            if (project == null)
            {
                continue;
            }
            ...
        }
于 2012-10-18T10:17:33.583 に答える