【问题标题】:How to find a ProjectItem by the file name如何通过文件名查找 ProjectItem
【发布时间】:2013-10-17 12:54:52
【问题描述】:

我正在为 Visual Studio 开发一个自定义工具。该工具已分配给文件,在文件更改时我收到此文件的名称并且应该在项目中生成一些更改。我需要通过收到的文件名找到一个 ProjectItem。我发现只有一个解决方案它枚举了解决方案的每个项目中的所有项目项。但这似乎是一个巨大的解决方案。有没有办法通过文件名获取项目项而不枚举?

这是我对 IVsSingleFileGenerator 的 Generate 方法的实现

public int Generate(string sourceFilePath, string sourceFileContent, string defaultNamespace, IntPtr[] outputFileContents, out uint output, IVsGeneratorProgress generateProgress)
{
    var dte = (EnvDTE.DTE)Package.GetGlobalService(typeof(EnvDTE.DTE));

    ProjectItem projectItem = null;

    foreach (Project project in dte.Solution.Projects)
    {
        foreach (ProjectItem item in project.ProjectItems)
        {
            var path = item.Properties.Item("FullPath").Value;
            if (sourceFilePath.Equals(path, StringComparison.OrdinalIgnoreCase))
            {
                projectItem = item;
            }
        }               
    }

    output = 0;
    outputFileContents[0] = IntPtr.Zero;

    return Microsoft.VisualStudio.VSConstants.S_OK;
}

【问题讨论】:

  • 不清楚:你是先解析sln文件,然后解析每个csproj?还是您正在扫描文件系统?
  • 我在 VisualStudio 提供的 DTE 对象中搜索。

标签: c# .net visual-studio envdte


【解决方案1】:

我也在使用这个用户友好的 DTE 世界来创建指南。我没有找到更好的解决方案。基本上这些是我正在使用的方法:

迭代项目:

public static ProjectItem FindSolutionItemByName(DTE dte, string name, bool recursive)
{
    ProjectItem projectItem = null;
    foreach (Project project in dte.Solution.Projects)
    {
        projectItem = FindProjectItemInProject(project, name, recursive);

        if (projectItem != null)
        {
            break;
        }
    }
    return projectItem;
}

在单个项目中查找:

public static ProjectItem FindProjectItemInProject(Project project, string name, bool recursive)
{
    ProjectItem projectItem = null;

    if (project.Kind != Constants.vsProjectKindSolutionItems)
    {
        if (project.ProjectItems != null && project.ProjectItems.Count > 0)
        {
            projectItem = DteHelper.FindItemByName(project.ProjectItems, name, recursive);
        }
    }
    else
    {
        // if solution folder, one of its ProjectItems might be a real project
        foreach (ProjectItem item in project.ProjectItems)
        {
            Project realProject = item.Object as Project;

            if (realProject != null)
            {
                projectItem = FindProjectItemInProject(realProject, name, recursive);

                if (projectItem != null)
                {
                    break;
                }
            }
        }
    }

    return projectItem;
}

可以在here 找到我与更多 sn-ps 一起使用的代码,作为新项目的指导。搜索并获取源代码..

【讨论】:

  • 作为警告,这根本不考虑解决方案文件夹。 dteSolution.Projects 仅返回顶级项目,不返回解决方案文件夹中的项目 =(
  • 我看到这是旧的,但这确实应该有代码(或引用)到 'DteHelper.FindItemByName()'。
  • DteHelper 不是自定义代码,而是 Microsoft - 内置的。这将是一个全名:Microsoft.Practices.RecipeFramework.Library.DteHelper
  • 在哪里可以下载 Microsoft.Practices.RecipeFramework.Library?提前谢谢
  • @Jon 你知道在哪里可以找到图书馆吗?
【解决方案2】:

可能有点晚,但请使用 DTE2.Solution.FindProjectItem(fullPathofChangedFile);

【讨论】:

  • FindProjectItem(string FileName)EnvDTE.dll, 8.0.0.0EnvDTE._Solution 的成员(即Visual Studio 2005),顺便说一句 - 所以你不需要DTE2,只需DTE 就可以了。跨度>
【解决方案3】:

获取 project.documents - 查找项目 - 使用 Linq 查询文件

【讨论】:

    猜你喜欢
    • 2012-03-14
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多