2012-10-18 7 views
8

Ich versuche derzeit, über alle meine Projekte (Sharepoint) zu iterieren, um alle Feature-Guids in eine Datei zu bekommen. Dort möchte ich ihnen den Projektnamen voranstellen. Mein Problem ist, dass DTE.Solution.Item und DTE.Solution.Projects.Item (oder die Enumeratoren für foreach) keine Ganzzahl als Parameter annehmen und foreach ein Objekt zurückgibt, das nicht in Project umgewandelt werden kann.Zugriff auf Projekte über DTE in C# T4 Vorlage

Hier ist mein Code-Schnipsel:

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

Ok - der Code ist in Ordnung - der Debugger ist NICHT! Meine Ausnahmen wurden in einen Debug-Kontext geworfen, aber die Vorlage wird ordnungsgemäß ausgeführt, wenn der Debugger nicht angefügt ist.

+0

ich genau dieses gleiche Problem sehe, und gerade heute morgen begegnet (gutes Timing auf die Frage). In meinem Fall wird eine InvalidCastException ausgelöst, wenn Project.ProjectItems iteriert wird. Wie unten beschrieben, wird es nur beim Debuggen der Vorlage ausgelöst. – daveaglick

Antwort

12

Versuchen Sie, die Solution.Projects Eigenschaft:

<#@ 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: Meine Antwort aktualisiert. Der obige Code ist eine T4-Vorlage, die erfolgreich auf meinem Visual Studio 2010 ausgeführt wird. – Steven

+0

Okay - ich sehe das Problem jetzt - ich habe versucht, meine t4 seit einiger Zeit zu debuggen - aber ich debuggte nicht Ihre, aber wenn ich es tat, war Ihre scheitert auch. Es scheint also, T4-Debugging ist nicht von seiner besten Seite. – TGlatzer

+0

Kann ich Sie beide als Antwort markieren? – TGlatzer

2

Versuchen Sie, diese

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

Nun, dies stürzte den T4VSHostProcess .... – TGlatzer

+0

@ Grumbler85 Neugierig. Ich benutze es regelmäßig ohne Nebenwirkungen. – podiluska

+0

Vielleicht gibt es ein Problem mit VS2012? – TGlatzer

Verwandte Themen