如何在VS 2012中从外接程序中找到启动项目

本文关键字:程序 项目 启动 VS 2012 | 更新日期: 2023-09-27 18:20:27

我为VS2012编写了一个插件。在某个时刻,我需要找到一个对应于解决方案启动项目的Project对象。我使用了数组_applicationObject.Solution.SolutionBuild.StartupProjects,它为我提供了启动项目的名称,然后我转到_applicationObject.Solution.Item(projectName),它通常返回一个"好"项目对象。(我的解决方案与微软推荐的类似http://msdn.microsoft.com/en-us/library/ms228782.aspx)

但如果启动项目不在解决方案的顶层(比如有一个解决方案Sol1,它下面有一个文件夹"Demo",启动项目在"Demo"中),我的方法就不起作用了。

_applicationObject.Solution.SolutionBuild.StartupProjects返回正确的名称,但项目集合不包含我的启动项目-它只包含"Demo"(顶级)名称。

我希望有人能向我展示一种正确的方法来找到一个启动项目

如何在VS 2012中从外接程序中找到启动项目

要从启动对象名称(我个人使用全名)转换为Project,您需要递归遍历项目层次结构,如下所示:

// 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);
        }
    }
}
}