From fb5ab19bfd85393845940be1e6f06bfeb97622b5 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 1 Apr 2020 21:28:42 +0200 Subject: [PATCH] SolutionCreator: Store project type GUID in .sln --- .../CSharp/WholeProjectDecompiler.cs | 2 +- ICSharpCode.Decompiler/Solution/ProjectId.cs | 21 ++++++++++++++++++- .../Solution/ProjectItem.cs | 4 ++-- .../Solution/SolutionCreator.cs | 5 ++--- 4 files changed, 25 insertions(+), 7 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs b/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs index 769b5d33c..bf272a3d2 100644 --- a/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/WholeProjectDecompiler.cs @@ -302,7 +302,7 @@ namespace ICSharpCode.Decompiler.CSharp w.WriteEndDocument(); } - return new ProjectId(platformName, guid); + return new ProjectId(platformName, guid, ProjectTypeGuids.CSharpWindows); } protected virtual bool IsGacAssembly(Metadata.IAssemblyReference r, Metadata.PEFile asm) diff --git a/ICSharpCode.Decompiler/Solution/ProjectId.cs b/ICSharpCode.Decompiler/Solution/ProjectId.cs index cfa3feb7c..e067babed 100644 --- a/ICSharpCode.Decompiler/Solution/ProjectId.cs +++ b/ICSharpCode.Decompiler/Solution/ProjectId.cs @@ -32,24 +32,43 @@ namespace ICSharpCode.Decompiler.Solution /// The project GUID. /// /// Thrown when is null or empty. - public ProjectId(string projectPlatform, Guid projectGuid) + public ProjectId(string projectPlatform, Guid projectGuid, Guid typeGuid) { if (string.IsNullOrWhiteSpace(projectPlatform)) { throw new ArgumentException("The platform cannot be null or empty.", nameof(projectPlatform)); } Guid = projectGuid; + TypeGuid = typeGuid; PlatformName = projectPlatform; } /// /// Gets the GUID of this project. + /// This is usually a newly generated GUID for each decompiled project. /// public Guid Guid { get; } + /// + /// Gets the primary type GUID of this project. + /// This is one of the GUIDs from . + /// + public Guid TypeGuid { get; } + /// /// Gets the platform name of this project. Only single platform per project is supported. /// public string PlatformName { get; } } + + public static class ProjectTypeGuids + { + public static readonly Guid SolutionFolder = Guid.Parse("{2150E333-8FDC-42A3-9474-1A3956D46DE8}"); + + public static readonly Guid CSharpWindows = Guid.Parse("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}"); + public static readonly Guid CSharpCore = Guid.Parse("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}"); + + public static readonly Guid Silverlight = Guid.Parse("{A1591282-1198-4647-A2B1-27E5FF5F6F3B}"); + public static readonly Guid PortableLibrary = Guid.Parse("{786C830F-07A1-408B-BD7F-6EE04809D6DB}"); + } } diff --git a/ICSharpCode.Decompiler/Solution/ProjectItem.cs b/ICSharpCode.Decompiler/Solution/ProjectItem.cs index bf1222368..5f669b018 100644 --- a/ICSharpCode.Decompiler/Solution/ProjectItem.cs +++ b/ICSharpCode.Decompiler/Solution/ProjectItem.cs @@ -35,8 +35,8 @@ namespace ICSharpCode.Decompiler.Solution /// /// Thrown when /// or is null or empty. - public ProjectItem(string projectFile, string projectPlatform, Guid projectGuid) - : base(projectPlatform, projectGuid) + public ProjectItem(string projectFile, string projectPlatform, Guid projectGuid, Guid typeGuid) + : base(projectPlatform, projectGuid, typeGuid) { ProjectName = Path.GetFileNameWithoutExtension(projectFile); FilePath = projectFile; diff --git a/ICSharpCode.Decompiler/Solution/SolutionCreator.cs b/ICSharpCode.Decompiler/Solution/SolutionCreator.cs index 824f03a23..1e4d3619b 100644 --- a/ICSharpCode.Decompiler/Solution/SolutionCreator.cs +++ b/ICSharpCode.Decompiler/Solution/SolutionCreator.cs @@ -88,13 +88,12 @@ namespace ICSharpCode.Decompiler.Solution private static void WriteProjects(TextWriter writer, IEnumerable projects, string solutionFilePath) { - var solutionGuid = Guid.NewGuid().ToString("B").ToUpperInvariant(); - foreach (var project in projects) { var projectRelativePath = GetRelativePath(solutionFilePath, project.FilePath); + var typeGuid = project.TypeGuid.ToString("B").ToUpperInvariant(); var projectGuid = project.Guid.ToString("B").ToUpperInvariant(); - writer.WriteLine($"Project(\"{solutionGuid}\") = \"{project.ProjectName}\", \"{projectRelativePath}\", \"{projectGuid}\""); + writer.WriteLine($"Project(\"{typeGuid}\") = \"{project.ProjectName}\", \"{projectRelativePath}\", \"{projectGuid}\""); writer.WriteLine("EndProject"); } }