2012-10-18 15 views
8

Attualmente sto cercando di ripetere tutti i miei progetti (sharepoint) per ottenere tutti i guids delle funzionalità in un file. li voglio prefisso con il nome del progetto. Il mio problema è DTE.Solution.Item e DTE.Solution.Projects.Item (o gli enumeratori foreach) non prenderanno un numero intero come parametro e foreach restituisce un oggetto che non è applicabile a Project.Accesso ai progetti tramite DTE in C# T4 Template

Ecco il mio frammento di codice:

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); 
} 

Va bene - il codice va bene - il debugger non è! Eccezioni personali in cui viene inserito in un contesto di debug, ma il modello funzionerà correttamente, se il debugger non è collegato.

+0

sto vedendo questo esatto lo stesso problema, e appena incontrato questa mattina (buona scelta di tempo sulla questione). Nel mio caso sta lanciando un InvalidCastException durante l'iterazione di Project.ProjectItems. Come descritto di seguito, genera solo durante il debug del modello. – daveaglick

risposta

12

Prova la proprietà 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 #> 
    <# 
} 

#> 
+0

@ Grumbler85: aggiornata la mia risposta. Il codice sopra è un modello T4 che viene eseguito correttamente sul mio Visual Studio 2010. – Steven

+0

Okay - vedo il problema ora - ho provato a eseguire il debug del mio t4 da un po 'di tempo - ma non ho eseguito il debug del tuo, ma quando l'ho fatto, il tuo era anche in mancanza. Quindi sembra che T4-Debugging non sia al meglio. – TGlatzer

+0

Posso contraddistinguerli entrambi come risposta? – TGlatzer

2

Prova questa

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

Bene, questo ha provocato il crash del T4VSHostProcess .... – TGlatzer

+0

@ Grumbler85 Curioso. Lo uso regolarmente senza effetti negativi. – podiluska

+0

Forse c'è un problema con VS2012? – TGlatzer