2014-09-03 63 views
0

我爲VS2012編寫了一個加載項。 在某些時候,我需要找到與解決方案的啓動項目相對應的Project對象。 我使用了數組_applicationObject.Solution.SolutionBuild.StartupProjects,它給了我啓動項目的名字,然後我去了_applicationObject.Solution.Item(projectName),它通常返回一個「好」的Project對象。 (我的解決方案是類似於一個通過微軟http://msdn.microsoft.com/en-us/library/ms228782.aspx推薦)如何從VS 2012的加載項中找到啓動項目

但在情況下啓動項目不上的解決方案的頂層(比方說有一個解決方案SOL1,並在其下的文件夾「演示」,並啓動項目裏面的「演示」)我的方法不起作用。

_applicationObject.Solution.SolutionBuild.StartupProjects返回正確的名稱,但項目集合不包含我的啓動項目 - 它只包含「Demo」(頂級)名稱。

我希望有人能告訴我一個正確的方式找到一個啓動項目

回答

0

從啓動對象名稱(我個人使用的全名)的項目進行轉換,則需要遞歸遍歷項目層次結構是這樣的:

// REQUIRE(services->dte->Solution != nullptr); 
std::vector<gcroot<EnvDTE::Project^>> VSServices::get_all_projects() const 
{ 
REQUIRE(services->dte->Solution != nullptr); 
std::vector<gcroot<EnvDTE::Project^>> result; 
if (services->dte->Solution->Projects != nullptr) 
{ 
    for each(EnvDTE::Project^ project in services->dte->Solution->Projects) 
     get_all_projects_from_project(project, result); 
} 
return result; 
} 

void VSServices::get_all_projects_from_project(EnvDTE::Project^ project, 
              std::vector<gcroot<EnvDTE::Project^>>& result) const 
{ 
if (project != nullptr) 
{ 
    result.push_back(project); 
    if (project->ProjectItems != nullptr) 
    { 
     for each(EnvDTE::ProjectItem^ item in project->ProjectItems) 
     { 
      if (item != nullptr) 
       get_all_projects_from_project(dynamic_cast<EnvDTE::Project^>(item->Object), result); 
     } 
    } 
} 
} 
+0

謝謝謝爾蓋! – 2014-09-04 14:24:10