2017-04-10 97 views
1

我有一個VS2013插件,我正在將它移植到VS2017,我發現自己無法像2013年一樣在我的項目中迭代過濾器。這是我的代碼:在Visual Studio 2017中迭代VCFilter樹

public void OnSolutionLoaded() 
{ 
    DTE2 dte = Package.GetGlobalService(typeof(DTE)) as DTE2; 
    foreach (Project lProject in dte.Solution.Projects) 
    { 
     if(lProject.Kind == vcContextGuids.vcContextGuidVCProject) 
     { 
      VCProject proj = (VCProject)lProject.Object; 
      foreach (VCFilter childFilter in (IVCCollection)proj.Filters) 
      { 
       RecurseFilters(childFilter); 
      } 
      } 
    } 
} 

private void RecurseFilters(VCFilter filter) 
{ 
    foreach(VCFilter childFilter in (IVCCollection)filter.Filters) 
    { 
     RecurseFilters(childFilter); 
    } 
} 

如果我設置的遞歸斷點,它從來沒有擊中儘管我有內過濾器過濾很多。頂級過濾器很好。

我檢查了LSL,那不是。我正在運行VS 15.1。

我在做什麼錯?

編輯:上述代碼工作正常,直到您添加解決方案文件夾,然後遞歸不再起作用。我認爲這是一個錯誤,因爲這是對行爲的不同在VS2013

Example of breaking solution folder

回答

1

VS 15.1在項目從緩存中加載時仍然存在vc過濾器中的錯誤(請參閱 https://blogs.msdn.microsoft.com/vcblog/2016/10/05/faster-c-solution-load-with-vs-15/ 如何啓用/禁用vc項目緩存)。

該錯誤將在即將到來的VS更新(最有可能爲15.3)之一中修復。

並解釋您看到的行爲:當解決方案中只有一個項目時,不使用項目緩存,但只要有兩個或更多(並將解決方案文件夾計爲項目),桌面vc項目正在使用從緩存中讀取而不是加載msbuild項目的不同實現。

因此,作爲一種解決方法,現在,請設置工具 - 選項 - 文本編輯器 - C/C++ - 實驗 - 「實現更快的加載項目」假

+0

可悲的是,即使禁用了更快的項目加載,我仍然遇到同樣的問題。 –

+0

現在它正在工作。不知道爲什麼,可能是由於重新啓動。謝謝你的幫助。 –

0

請檢查是否有過濾器的頂級子過濾器。像這樣:

enter image description here

如果你有一個像上面的過濾器,你可以打在遞歸斷點(演示是由Visual Studio 2017年版15.1創建)是這樣的:

enter image description here

+0

如果我創建一個新的C++項目如期工作,但我已經遷移過的現有2013項目仍不能遍歷層次結構。我只獲得頂級過濾器。 –

+0

如果我創建一個新的2013項目並將其導入到2017年,它可以正常工作,所以我的特定項目 –

+0

確實有些奇怪,找到了問題,它是解決方案文件夾。只要你添加其中的一個,就會中斷樹迭代。 –