2009-09-16 53 views
13

我正在嘗試編寫一個Visual Studio加載項,其中包括需要跟蹤Visual Studio解決方案中的每個文件。我知道我需要訂閱哪些事件(當解決方案打開時,文件被添加/刪除/編輯,項目也一樣),但我不明白如何實際獲取文件列表從任何它。獲取VS加載項或DXCore插件的解決方案/項目文件列表

我最近安裝了CodeRush並且一直在玩DXCore框架。我對插件方法非常滿意,但我仍然沒有看到在解決方案中獲取文件列表的明顯方法。

所以總結起來:如何通過Visual Studio的SDK DXCore,我得到的解決方案文件的可靠清單和它的項目?

回答

5

這在Visual Studio SDK中使用DTE很容易實現。

您可以使用Projects界面獲得解決方案中的項目列表。

您可以使用ProjectItem界面獲取項目中的項目列表。

欲瞭解更多信息,我建議閱讀Controlling Projects and Solutions

+15

-1,不,它很容易的沒有,這個答案是一個快速谷歌搜索的只是結果。即使項目接口提供了可枚舉的ProjectItems,但它只包含項目中的頂級項目。項目文件夾需要遍歷,只有選中的文件。多個文件名也可能使項目更加複雜。 – 2015-06-23 14:18:48

17

謝謝,裏德;你鏈接的文章讓我有足夠的能力在幾分鐘內得到概念證明。

因爲我覺得它是相關的,這裏是我收集ProjectItems的迭代和遞歸手段。我在DXCore中做了這個,但同樣的想法適用於原始的Visual Studio SDK(DXCore僅僅是一個更好看的SDK封裝)。 「解決方案」,「項目」,「項目」和「ProjectItem」對象就在EnvDTE中。

設置項目

EnvDTE.Solution solution = CodeRush.ApplicationObject.Solution; 
EnvDTE.Projects projects = solution.Projects; 

遍歷項目拉ProjectItems

var projects = myProjects.GetEnumerator(); 
while (projects.MoveNext()) 
{ 
    var items = ((Project)projects.Current).ProjectItems.GetEnumerator(); 
    while (items.MoveNext()) 
    { 
     var item = (ProjectItem)items.Current; 
     //Recursion to get all ProjectItems 
     projectItems.Add(GetFiles(item)); 
    } 
} 

最後,我做的遞歸讓所有ProjectItems在活動解決方案

ProjectItem GetFiles(ProjectItem item) 
{ 
    //base case 
    if (item.ProjectItems == null) 
     return item; 

    var items = item.ProjectItems.GetEnumerator(); 
    while (items.MoveNext()) 
    { 
     var currentItem = (ProjectItem)items.Current; 
     projectItems.Add(GetFiles(currentItem)); 
    } 

    return item; 
} 
+0

這裏「CodeRush」的含義是什麼? – greenoldman 2011-03-12 12:19:28

+0

@macias「的CodeRush」這裏是主要對象的引用,用於訪問DXCore服務。 「CodeRush.ApplicationObject」屬性返回DXCore加載項實例的EnvDTE對象。要了解更多信息,請點擊此鏈接:http://bit.ly/hrweIk – 2011-03-14 15:25:27

+1

BTW,得到的使用DXCore API解決方案/項目文件的列表,使用此行代碼: IEnumerable的文件= CodeRush.Source.ActiveSolution 。全部文件; – 2011-03-14 15:31:48

1

EnvDTE : Getting all projects (the SolutionFolder PITA)

該解決方案出色的作品獲得所有項目的解決方案,即使項目子文件夾中。

請務必閱讀下面的代碼的註釋,因爲它指出了一個重要的補丁,使用此搶代替原來的代碼DTE2,否則它不會Visual Studio中的正確實例:

DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2; 

(代碼已更新爲包括上述固定)

相關問題