首页 > 解决方案 > 尝试遍历解决方案中的所有文档,但 ProjectItem.ProjectItems 为空

问题描述

我正在编写一个 Visual Studio 扩展,我想遍历当前解决方案中的所有文件(以查找具有相同名称的文件忽略扩展名)。环顾四周后,我发现我可以遍历解决方案中的所有项目,并从那里递归地遍历所有项目项及其子项。

在一个小的 C# 示例解决方案中,这很好用,但如果我在工作中尝试使用更大的 C++ 解决方案,它就不行了。在此解决方案中,所有项目都在解决方案文件夹中排序。Solution.Projects 包含上述文件夹,每个文件夹的 ProjectItems 属性包含项目(vcxproj 文件)。但是所有这些项目的 ProjectItems 属性都是空的。不为空,为空。所以递归结束得相当快,并且看不到一个实际的文档。

有没有搞错?我能做些什么呢?我如何在此处获取文件?

我已经看过这两个了。接受的答案是我已经拥有的:/

枚举当前 Visual Studio 项目中的所有文件

获取 VS 插件或 DXCore 插件的解决方案/项目文件列表

我的代码开始递归

DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
foreach (Project project in dte2.Solution.Projects)
{
    OpenAll(project.ProjectItems);
}

递归函数

protected void OpenAll(ProjectItems _aItems)
{
    Dispatcher.VerifyAccess();
    foreach (ProjectItem item in _aItems)
    {
        if (item.Name != null)
        {
            string name = item.Name.Contains(".") ? item.Name.Substring(0, item.Name.IndexOf('.')) : item.Name;
            if (string.Compare(StrName, name, true) == 0 && !item.IsOpen)
            {
                // if it's an item with the right name open it
                item.Open();
            }
        }
        if (item.ProjectItems != null && item.ProjectItems.Count > 0)
        {
            // Process sub items
            // I NEVER GET HERE BECAUSE ProjectItems IS NULL!
            OpenAll(item.ProjectItems);
        }
    }
}

标签: c#vsixvisual-studio-sdk

解决方案


我发现了问题。文件夹和文件表示为 SolutionItems,但 SulutionItems 中的项目不是 SolutionItems,而是 Projects,保存在SubProject属性中。因此,要完整遍历解决方案,您需要以下内容:

// Start the recursion
DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
foreach (Project project in dte2.Solution.Projects)
{
    OpenSimilarDocuments(project);
}

递归函数

private void OpenSimilarDocuments(Project _project)
{
    Dispatcher.VerifyAccess();
    if (_project == null)
    {
        return;
    }
    // Traverse all ProjectItems of the project
    if (_project.ProjectItems != null)
    {
        foreach (ProjectItem item in _project.ProjectItems)
        {
            OpenSimilarDocuments(item);
        }
    }
}

private void OpenSimilarDocuments(ProjectItem _item)
{
    Dispatcher.VerifyAccess();
    if (_item == null)
    {
        return;
    }
    // See if it is a file we want to open
    if (_item.Name != null)
    {
        string name = _item.Name.Contains(".") ? _item.Name.Substring(0, _item.Name.IndexOf('.')) : _item.Name;
        if (string.Compare(StrName, name, true) == 0 && !_item.IsOpen)
        {
            _item.Open();
        }
    }
    // Traverse all child ProjectItems
    if (_item.ProjectItems != null)
    {
        foreach (ProjectItem item in _item.ProjectItems)
        {
            OpenSimilarDocuments(item);
        }
    }
    // See if we have a child project and traverse that as well
    if (_item.SubProject != null)
    {
        OpenSimilarDocuments(_item.SubProject);
    }
}

仍然让我感到困惑的是,要查看 ProjectItem 是本身还是包含您不能简单使用的文档,ProjectItem.Document != null因为某些 ProjectItems 甚至没有此字段,因此代码会崩溃,但那是另一回事... <.<


推荐阅读