2012-10-18 23 views
8

Tôi hiện đang cố gắng lặp qua tất cả các dự án của tôi (sharepoint) để có được tất cả các tính năng guids vào một tệp. có tôi muốn tiền tố chúng với tên dự án. Vấn đề của tôi là DTE.Solution.Item và DTE.Solution.Projects.Item (hoặc các điều tra cho foreach) sẽ không lấy một số nguyên làm tham số và foreach trả về một đối tượng không thể cast được cho Project.Truy cập các Dự án qua DTE trong Mẫu C# T4

Dưới đây là đoạn mã của tôi:

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

Được rồi - mã là alright - trình gỡ lỗi là KHÔNG! Ngoại lệ của tôi được đưa vào ngữ cảnh gỡ lỗi, nhưng Mẫu sẽ chạy tốt nếu trình gỡ lỗi không được đính kèm.

+0

tôi nhìn thấy cùng một vấn đề chính xác này, và chỉ gặp nó sáng nay (thời gian tốt trên các câu hỏi). Trong trường hợp của tôi nó ném một InvalidCastException khi iterating Project.ProjectItems. Như được mô tả bên dưới, nó chỉ ném khi gỡ lỗi mẫu. – daveaglick

Trả lời

12

Thử Solution.Projects tài sản:

<#@ 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: Đã cập nhật câu trả lời của tôi. Đoạn mã trên là mẫu T4 chạy thành công trên Visual Studio 2010. – Steven

+0

Được rồi - tôi thấy vấn đề bây giờ - tôi đã cố gắng gỡ lỗi t4 của mình từ một thời gian - nhưng tôi đã không gỡ lỗi của bạn, nhưng khi tôi làm, cũng không thành công. Vì vậy, có vẻ như T4-Debugging không phải là lúc tốt nhất. – TGlatzer

+0

Tôi có thể đánh dấu cả hai bạn là câu trả lời? – TGlatzer

2

Hãy thử điều này

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

Vâng, điều này đã phá vỡ T4VSHostProcess .... – TGlatzer

+0

@ Grumbler85 Tò mò. Tôi sử dụng nó thường xuyên mà không bị ảnh hưởng. – podiluska

+0

Có thể có vấn đề với VS2012? – TGlatzer

Các vấn đề liên quan