2014-09-03 57 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