C# 与.slnFile相关的问题

C# 与.slnFile相关的问题,c#,regex,sln-file,C#,Regex,Sln File,问题1: c#项目文本的默认解决方案文件格式是否始终相同 Project(Solution GUI) = SolutionName , ProjectPath, csProjPath, ProjectGUI e、 g: 格式与:1它将有解决方案GUI,然后是解决方案名称,然后是csproj 路径和项目GUI 问题2: 我创建了一个正则表达式来获取由.sln生成的文本,下面是我得到的: Regex projectRegex = new Regex(@"Project\(\""([^\""]+)\

问题1: c#项目文本的默认解决方案文件格式是否始终相同

Project(Solution GUI) = SolutionName , ProjectPath, csProjPath, ProjectGUI
e、 g:

格式与:1它将有解决方案GUI,然后是解决方案名称,然后是csproj 路径和项目GUI

问题2: 我创建了一个正则表达式来获取由.sln生成的文本,下面是我得到的:

Regex projectRegex = new Regex(@"Project\(\""([^\""]+)\""\)\s*\=\s*\""([^\""]+)\""\,\s*\""([^\""]+)""\,\s*\""([^\""]+)""");
但是我不确定我的正则表达式中是否有与第一个问题相关的bug,所以我想是否有更好的正则表达式或任何条件(例如解析或任何必须更快的条件)来获取项目文本(我需要得到的)是csProj路径(在上面的Group3上的正则表达式模式中)

对于Q1所示示例中应用的组:

Group1: {FAE14EC0-321D-12D3-GF35-01C04F79EFBC}
Group2: WindowsFormsApplication26
Group3: WindowsFormsApplication26\WindowsFormsApplication26.csproj
Group4: {25F0453B-9C88-4C9E-AG6A-97873BB6EA23}

我认为您的方法应该是正确工作,但要从解决方案文件中提取信息,我们通过访问“Microsoft.Build”命名空间的内部技术使用以下方法。由于相应的框架函数标记为
内部
,因此有必要对其进行“破解”。因此,使用反射的方法非常复杂。(这是我们在互联网上找到的其他代码片段的浓缩摘录——也是在SO中)

public struct ProjectData
{
公共字符串名称;
公共字符串Guid;
公共字符串路径;
}
公共静态列表GetProjectsInSolution(字符串路径到解决方案文件)
{
类型parserType=Type.GetType(“Microsoft.Build.Construction.SolutionParser,Microsoft.Build,Version=4.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”,false,false);
ConstructorInfo ConstructorInfo=parserType.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance).First();
object solutionParser=constructorInfo.Invoke(null);
PropertyInfo solutionFileProperty=parserType.GetProperty(“SolutionFile”,BindingFlags.NonPublic | BindingFlags.Instance);
SetValue(solutionParser,pathToSolutionFile);
MethodInfo parserMethod=parserType.GetMethod(“ParseSolutionFile”,BindingFlags.NonPublic | BindingFlags.Instance);
Invoke(solutionParser,null);
PropertyInfo projectInfo=parserType.GetProperty(“项目”,BindingFlags.NonPublic | BindingFlags.Instance);
object[]projects=projectInfo.GetValue(solutionParser)作为对象[];
类型projectType=Type.GetType(“Microsoft.Build.Construction.ProjectSolution,Microsoft.Build,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”,false,false);
PropertyInfo-nameInfo=projectType.GetProperty(“ProjectName”,BindingFlags.NonPublic | BindingFlags.Instance);
PropertyInfo-guidInfo=projectType.GetProperty(“ProjectGuid”,BindingFlags.NonPublic | BindingFlags.Instance);
PropertyInfo pathInfo=projectType.GetProperty(“RelativePath”,BindingFlags.NonPublic | BindingFlags.Instance);
List projectData=新列表();
如果(项目!=null)
{
foreach(项目中的对象项目)
{
添加(新项目数据()
{
Name=nameInfo.GetValue(项目)作为字符串,
Guid=guidInfo.GetValue(项目)作为字符串,
Path=pathInfo.GetValue(项目)作为字符串
});
}
}
返回项目数据;
}

解决方案GUI如何?我猜GUI版本不是出现在Project之后的版本(“…但是前3个信息是正确的…但是它不是出现在Project之后的版本(“…或者它刚刚重新生成?(或者如果不是,我如何获得它?)…无论如何,答案是有效的,因此如果该部分无法通过解析器获得,我将接受此答案…它应该是CS项目的GUID。您可以在创建
solutionParser
对象后设置断点。在“Watch”窗口中检查此对象的静态!!成员。也许您可以在此处找到的其中一个GUID就是您正在查找的GUID。ive测试它…生成的Guid是项目GUI,它是csProj旁边的GUI,正如我在上面的问题中提到的,但是版本不是我要找的那个,而是Guid(如果我错了,请更正我),它是这样的:项目({FAE14EC0-321D-12D3-GF35-01C04F79EFBC})
Group1: {FAE14EC0-321D-12D3-GF35-01C04F79EFBC}
Group2: WindowsFormsApplication26
Group3: WindowsFormsApplication26\WindowsFormsApplication26.csproj
Group4: {25F0453B-9C88-4C9E-AG6A-97873BB6EA23}
public struct ProjectData
{
    public string Name;
    public string Guid;
    public string Path;
}

public static List<ProjectData> GetProjectsInSolution(string pathToSolutionFile)
{
    Type parserType = Type.GetType("Microsoft.Build.Construction.SolutionParser, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", false, false);

    ConstructorInfo constructorInfo = parserType.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance).First();
    object solutionParser = constructorInfo.Invoke(null);

    PropertyInfo solutionFileProperty = parserType.GetProperty("SolutionFile", BindingFlags.NonPublic | BindingFlags.Instance);
    solutionFileProperty.SetValue(solutionParser, pathToSolutionFile);

    MethodInfo parserMethod = parserType.GetMethod("ParseSolutionFile", BindingFlags.NonPublic | BindingFlags.Instance);
    parserMethod.Invoke(solutionParser, null);

    PropertyInfo projectInfo = parserType.GetProperty("Projects", BindingFlags.NonPublic | BindingFlags.Instance);
    object[] projects = projectInfo.GetValue(solutionParser) as object[];

    Type projectType = Type.GetType("Microsoft.Build.Construction.ProjectInSolution, Microsoft.Build, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", false, false);

    PropertyInfo nameInfo = projectType.GetProperty("ProjectName", BindingFlags.NonPublic | BindingFlags.Instance);
    PropertyInfo guidInfo = projectType.GetProperty("ProjectGuid", BindingFlags.NonPublic | BindingFlags.Instance);
    PropertyInfo pathInfo = projectType.GetProperty("RelativePath", BindingFlags.NonPublic | BindingFlags.Instance);

    List<ProjectData> projectData = new List<ProjectData>();

    if (projects != null)
    {
        foreach (object project in projects)
        {
            projectData.Add(new ProjectData()
            {
                Name = nameInfo.GetValue(project) as string,
                Guid = guidInfo.GetValue(project) as string,
                Path = pathInfo.GetValue(project) as string
            });
        }
    }

    return projectData;
}