从 Visual Studio 解决方案 (.sln) 文件获取解决方案项目

问题描述 投票:0回答:1

我正在使用

SolutionFile.Parse
Microsoft.Build
包版本 17.10.4)中的 Microsoft.Build.Construction 来提取项目信息,但我还需要获取解决方案项目,例如packages.props 文件。我可以看到它们占用了 Visual Studio 解决方案中的“Solution Items”文件夹,但解析的
SolutionFile
对象不包含此信息;尽管存在表示解决方案该部分的
SolutionFolder
对象,但在 Visual Studio 中出现的文件列表并未在解析的对象中表示。以编程方式获取这些详细信息的最佳方法是什么?

c# visual-studio projects-and-solutions
1个回答
0
投票

这可能是获取解决方案项目信息的一个很好的例子:

using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
    class Program
    {
        static void Main()
        {
            string solutionPath = @"C:\Users\SolutionItems\SolutionItems.sln"; //change to your path
            if (!File.Exists(solutionPath))
            {
                Console.WriteLine($"Solution file not found: {solutionPath}");
                return;
            }
            string[] solutionLines = File.ReadAllLines(solutionPath);
            Regex projectRegex = new Regex(@"Project\(""{[^}]+}""\)\s+=\s+""[^""]+"",\s+""[^""]+"",\s+""[^""]+""");
            Regex solutionItemsRegex = new Regex(@"^\s*GlobalSection\(SolutionItems\) = preSolution$");
    
            List<string> solutionItems = new List<string>();
            bool inSolutionItemsSection = false;
    
            foreach (string line in solutionLines)
            {
                if (solutionItemsRegex.IsMatch(line))
                {
                    inSolutionItemsSection = true;
                    continue;
                }
    
                if (inSolutionItemsSection)
                {
                    if (line.Trim().StartsWith("EndGlobalSection"))
                    {
                        inSolutionItemsSection = false;
                        continue;
                    }
                    var match = Regex.Match(line.Trim(), @"^(?<file>[^=]+)\s*=\s*(?<path>.+)$");
                    if (match.Success)
                    {
                        var file = match.Groups["file"].Value.Trim();
                        var path = match.Groups["path"].Value.Trim();
                        solutionItems.Add(path);
                    }
                }
                else if (projectRegex.IsMatch(line))
                {
                    Console.WriteLine(line);
                }
            }
            Console.WriteLine("Solution Items:");
            foreach (var item in solutionItems)
            {
                Console.WriteLine(item);
            }
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.