如何获得解决方案中的所有项目名称?

用户名

如何通过C#获取解决方案中的所有项目名称?该解决方案具有控制台项目,其中有许多Windows服务。

我的目标是找到所有项目名称,然后在项目中获取所有Windows服务名称。

该实现将在同一解决方案的新项目中完成。感谢您的提示。

拉胡尔·特里帕蒂(Rahul Tripathi)

选中此MSDN,它将解决您的查询。

.sln文件包含环境用于查找和加载持久数据及其引用的项目VSPackages的名称-值参数的基于文本的信息。当用户打开解决方案时,环境会循环浏览.sln文件中的preSolution,Project和postSolution信息,以加载解决方案,解决方案中的项目以及与解决方案相关的所有持久性信息。

还要检查EnvDTE:获取所有项目

还要检查此主题(对John Leidegren的感谢,因为他提供了很好的答案)

public class Solution
{
    //internal class SolutionParser
    //Name: Microsoft.Build.Construction.SolutionParser
    //Assembly: Microsoft.Build, Version=4.0.0.0

    static readonly Type s_SolutionParser;
    static readonly PropertyInfo s_SolutionParser_solutionReader;
    static readonly MethodInfo s_SolutionParser_parseSolution;
    static readonly PropertyInfo s_SolutionParser_projects;

    static Solution()
    {
        s_SolutionParser = Type.GetType("Microsoft.Build.Construction.SolutionParser, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", false, false);
        if (s_SolutionParser != null)
        {
            s_SolutionParser_solutionReader = s_SolutionParser.GetProperty("SolutionReader", BindingFlags.NonPublic | BindingFlags.Instance);
            s_SolutionParser_projects = s_SolutionParser.GetProperty("Projects", BindingFlags.NonPublic | BindingFlags.Instance);
            s_SolutionParser_parseSolution = s_SolutionParser.GetMethod("ParseSolution", BindingFlags.NonPublic | BindingFlags.Instance);
        }
    }

    public List<SolutionProject> Projects { get; private set; }

    public Solution(string solutionFileName)
    {
        if (s_SolutionParser == null)
        {
            throw new InvalidOperationException("Can not find type 'Microsoft.Build.Construction.SolutionParser' are you missing a assembly reference to 'Microsoft.Build.dll'?");
        }
        var solutionParser = s_SolutionParser.GetConstructors(BindingFlags.Instance | BindingFlags.NonPublic).First().Invoke(null);
        using (var streamReader = new StreamReader(solutionFileName))
        {
            s_SolutionParser_solutionReader.SetValue(solutionParser, streamReader, null);
            s_SolutionParser_parseSolution.Invoke(solutionParser, null);
        }
        var projects = new List<SolutionProject>();
        var array = (Array)s_SolutionParser_projects.GetValue(solutionParser, null);
        for (int i = 0; i < array.Length; i++)
        {
            projects.Add(new SolutionProject(array.GetValue(i)));
        }
        this.Projects = projects;
    }
}

[DebuggerDisplay("{ProjectName}, {RelativePath}, {ProjectGuid}")]
public class SolutionProject
{
    static readonly Type s_ProjectInSolution;
    static readonly PropertyInfo s_ProjectInSolution_ProjectName;
    static readonly PropertyInfo s_ProjectInSolution_RelativePath;
    static readonly PropertyInfo s_ProjectInSolution_ProjectGuid;

    static SolutionProject()
    {
        s_ProjectInSolution = Type.GetType("Microsoft.Build.Construction.ProjectInSolution, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", false, false);
        if (s_ProjectInSolution != null)
        {
            s_ProjectInSolution_ProjectName = s_ProjectInSolution.GetProperty("ProjectName", BindingFlags.NonPublic | BindingFlags.Instance);
            s_ProjectInSolution_RelativePath = s_ProjectInSolution.GetProperty("RelativePath", BindingFlags.NonPublic | BindingFlags.Instance);
            s_ProjectInSolution_ProjectGuid = s_ProjectInSolution.GetProperty("ProjectGuid", BindingFlags.NonPublic | BindingFlags.Instance);
        }
    }

    public string ProjectName { get; private set; }
    public string RelativePath { get; private set; }
    public string ProjectGuid { get; private set; }

    public SolutionProject(object solutionProject)
    {
        this.ProjectName = s_ProjectInSolution_ProjectName.GetValue(solutionProject, null) as string;
        this.RelativePath = s_ProjectInSolution_RelativePath.GetValue(solutionProject, null) as string;
        this.ProjectGuid = s_ProjectInSolution_ProjectGuid.GetValue(solutionProject, null) as string;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

解决方案文件中的C#项目名称

来自分类Dev

如何获得解决方案项目中的所有类型?

来自分类Dev

解决方案根据多项目模板中的项目名称更改文件夹名称

来自分类Dev

如何获得拓扑排序的所有解决方案

来自分类Dev

如何获得拓扑排序的所有解决方案

来自分类Dev

获取解决方案中的所有启动项目

来自分类Dev

如何在解决方案中设置所有项目以复制本地false

来自分类Dev

如何使我的解决方案中的所有项目在共享 assemblyVersion 上具有相同的产品版本?

来自分类Dev

在VSTS中构建项目不会在解决方案中构建所有项目

来自分类Dev

如何将解决方案文件中的所有项目更改为 C++17 MSVC?

来自分类Dev

Visual Studio在解决方案资源管理器中的项目名称中添加一个数字

来自分类Dev

dotCover没有显示解决方案中的所有项目

来自分类Dev

for 循环没有从列表中删除所有项目,解决方案是什么?

来自分类Dev

在解决方案中添加现有项目-导致引用名称空间错误

来自分类Dev

如何在C#项目(解决方案)中找到所有硬编码值?

来自分类Dev

获取驱动器中的所有项目名称

来自分类常见问题

将.NET 4.5.2解决方案中的所有项目重新定位

来自分类Dev

将属性更改应用于解决方案中的所有DLL项目

来自分类Dev

在 Visual Studio 解决方案中设置所有项目的运行时库

来自分类Dev

无法调试解决方案中的所有项目,因为 PDB 未正确加载

来自分类Dev

工作副本“<项目名称>”未能提交文件 - 无法与辅助应用程序通信 - 解决方案不起作用

来自分类Dev

如何在具有其他项目的解决方案中编译单个项目?

来自分类Dev

如何使一个递归解决方案返回所有可能的解决方案?

来自分类Dev

在大型Visual Studio解决方案中,如何快速识别带有构建事件的项目?

来自分类Dev

在 ojAlgo 中显示所有可能的解决方案

来自分类Dev

如何从解决方案中引用项目?

来自分类Dev

如何运行相同解决方案中的项目?

来自分类Dev

解决方案中的项目之间如何共享单个配置?

来自分类Dev

如何运行相同解决方案中的项目?

Related 相关文章

  1. 1

    解决方案文件中的C#项目名称

  2. 2

    如何获得解决方案项目中的所有类型?

  3. 3

    解决方案根据多项目模板中的项目名称更改文件夹名称

  4. 4

    如何获得拓扑排序的所有解决方案

  5. 5

    如何获得拓扑排序的所有解决方案

  6. 6

    获取解决方案中的所有启动项目

  7. 7

    如何在解决方案中设置所有项目以复制本地false

  8. 8

    如何使我的解决方案中的所有项目在共享 assemblyVersion 上具有相同的产品版本?

  9. 9

    在VSTS中构建项目不会在解决方案中构建所有项目

  10. 10

    如何将解决方案文件中的所有项目更改为 C++17 MSVC?

  11. 11

    Visual Studio在解决方案资源管理器中的项目名称中添加一个数字

  12. 12

    dotCover没有显示解决方案中的所有项目

  13. 13

    for 循环没有从列表中删除所有项目,解决方案是什么?

  14. 14

    在解决方案中添加现有项目-导致引用名称空间错误

  15. 15

    如何在C#项目(解决方案)中找到所有硬编码值?

  16. 16

    获取驱动器中的所有项目名称

  17. 17

    将.NET 4.5.2解决方案中的所有项目重新定位

  18. 18

    将属性更改应用于解决方案中的所有DLL项目

  19. 19

    在 Visual Studio 解决方案中设置所有项目的运行时库

  20. 20

    无法调试解决方案中的所有项目,因为 PDB 未正确加载

  21. 21

    工作副本“<项目名称>”未能提交文件 - 无法与辅助应用程序通信 - 解决方案不起作用

  22. 22

    如何在具有其他项目的解决方案中编译单个项目?

  23. 23

    如何使一个递归解决方案返回所有可能的解决方案?

  24. 24

    在大型Visual Studio解决方案中,如何快速识别带有构建事件的项目?

  25. 25

    在 ojAlgo 中显示所有可能的解决方案

  26. 26

    如何从解决方案中引用项目?

  27. 27

    如何运行相同解决方案中的项目?

  28. 28

    解决方案中的项目之间如何共享单个配置?

  29. 29

    如何运行相同解决方案中的项目?

热门标签

归档