我为VS2012写了一个加载项。 在某些时候,我需要找到一个与解决方案的启动项目相对应的Project对象。 我使用了数组_applicationObject.Solution.SolutionBuild.StartupProjects,它给了我启动项目的名称,然后我去了_applicationObject.Solution.Item(projectName),它通常返回一个" good"项目对象。 (我的解决方案类似于Microsoft http://msdn.microsoft.com/en-us/library/ms228782.aspx推荐的解决方案)
但是,如果启动项目不在最高级别的解决方案上(比如解决方案Sol1,在它下面有一个文件夹" Demo",以及启动项目内部" Demo&#34 ;)我的方法不起作用。
_applicationObject.Solution.SolutionBuild.StartupProjects返回正确的名称,但项目集合不包含我的启动项目 - 它只包含" Demo" (顶级)名称。
我希望有人能告诉我找到启动项目的正确方法
答案 0 :(得分: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);
}
}
}
}