diff --git a/Directory.Packages.props b/Directory.Packages.props
index 86630cb..aeb0141 100644
--- a/Directory.Packages.props
+++ b/Directory.Packages.props
@@ -14,6 +14,7 @@
+
@@ -27,4 +28,4 @@
-
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 5beadd1..ff8e379 100644
--- a/README.md
+++ b/README.md
@@ -225,6 +225,22 @@ And the resulting project would look like this:
```
+# Visual Studio Solutions
+You can create Visual Studio solutions with the `SolutionCreator` class.
+This class is a wrapper around the [VS-SolutionPersistence] library which supports both `.sln` and `.slnx` solution file formats.
+
+The following example creates a solution with two projects:
+```C#
+ProjectCreator project1 = ProjectCreator.Templates.SdkCsproj(path: Path.Combine(Environment.CurrentDirectory, "project1", "project1.csproj"));
+
+SolutionCreator.Create(Path.Combine(Environment.CurrentDirectory, "solution1.sln"))
+ .Configuration("Debug")
+ .Configuration("Release")
+ .Platform("Any CPU")
+ .Project(project1)
+ .Save();
+```
+
# Package Repositories and Feeds
NuGet and MSBuild are very tightly coupled and a lot of times you need packages available when building projects. This API offers two solutions:
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation.UnitTests/SolutionTests.cs b/src/Microsoft.Build.Utilities.ProjectCreation.UnitTests/SolutionTests.cs
new file mode 100644
index 0000000..461675d
--- /dev/null
+++ b/src/Microsoft.Build.Utilities.ProjectCreation.UnitTests/SolutionTests.cs
@@ -0,0 +1,55 @@
+// Copyright (c) Jeff Kluge. All rights reserved.
+//
+// Licensed under the MIT license.
+
+using Microsoft.VisualStudio.SolutionPersistence.Model;
+using Shouldly;
+using System.IO;
+using Xunit;
+
+namespace Microsoft.Build.Utilities.ProjectCreation.UnitTests
+{
+ public class SolutionTests : TestBase
+ {
+ [Fact]
+ public void BasicTest()
+ {
+ string solutionFileFullPath = Path.Combine(TestRootPath, "solution1.sln");
+
+ string project1Name = "project1";
+
+ string project1FullPath = Path.Combine(TestRootPath, project1Name, "project1.csproj");
+
+ ProjectCreator project1 = ProjectCreator.Templates.SdkCsproj(project1FullPath);
+
+ SolutionCreator solution = SolutionCreator.Create(solutionFileFullPath)
+ .TryProject(project1, projectInSolution: out SolutionProjectModel projectInSolution)
+ .Save();
+
+ File.ReadAllText(solutionFileFullPath).ShouldBe(
+ @$"Microsoft Visual Studio Solution File, Format Version 12.00
+Project(""{{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}}"") = ""{project1Name}"", ""{project1FullPath.Replace('/', '\\')}"", ""{{{projectInSolution.Id.ToString().ToUpperInvariant()}}}""
+EndProject
+Global
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
+",
+ StringCompareShould.IgnoreLineEndings);
+ }
+
+ [Fact]
+ public void CanBuild()
+ {
+ ProjectCreator project1 = ProjectCreator.Templates.SdkCsproj(path: Path.Combine(TestRootPath, "project1", "project1.csproj"));
+
+ SolutionCreator.Create(Path.Combine(TestRootPath, "solution1.sln"))
+ .Configuration("Debug")
+ .Configuration("Release")
+ .Platform("Any CPU")
+ .Project(project1)
+ .TryBuild(out _);
+ }
+ }
+}
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/BuildHost.cs b/src/Microsoft.Build.Utilities.ProjectCreation/BuildHost.cs
new file mode 100644
index 0000000..2bfbd86
--- /dev/null
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/BuildHost.cs
@@ -0,0 +1,209 @@
+// Copyright (c) Jeff Kluge. All rights reserved.
+//
+// Licensed under the MIT license.
+
+using Microsoft.Build.Evaluation;
+using Microsoft.Build.Execution;
+using Microsoft.Build.Framework;
+using System;
+using System.Collections.Generic;
+
+namespace Microsoft.Build.Utilities.ProjectCreation
+{
+ internal static class BuildHost
+ {
+ private static readonly IDictionary EmptyGlobalProperties = new Dictionary(capacity: 0);
+
+#if !NET8_0
+ private static readonly IDictionary EmptyGlobalPropertiesWithNull = new Dictionary(capacity: 0);
+#endif
+
+ public static bool Restore(
+ string projectFullPath,
+ ProjectCollection projectCollection,
+ IDictionary? globalProperties,
+ BuildOutput buildOutput,
+ out IDictionary? targetOutputs)
+ {
+ Dictionary restoreGlobalProperties = new(globalProperties ?? projectCollection.GlobalProperties); // IMPORTANT: Make a copy of the global properties here so as not to modify the ones passed in
+
+ restoreGlobalProperties["ExcludeRestorePackageImports"] = "true";
+ restoreGlobalProperties["MSBuildRestoreSessionId"] = Guid.NewGuid().ToString("D");
+
+ BuildRequestDataFlags buildRequestDataFlags = BuildRequestDataFlags.ClearCachesAfterBuild | BuildRequestDataFlags.SkipNonexistentTargets | BuildRequestDataFlags.IgnoreMissingEmptyAndInvalidImports;
+
+ return BuildProjectFromFullPath(projectFullPath, ["Restore"], restoreGlobalProperties, [.. projectCollection.Loggers, buildOutput], buildRequestDataFlags, out targetOutputs);
+ }
+
+ public static bool TryBuild(
+ string projectFullPath,
+ ProjectCollection projectCollection,
+ BuildOutput buildOutput,
+ out IDictionary? targetOutputs,
+ bool restore = false,
+ string? target = null,
+ IDictionary? globalProperties = null)
+ {
+ return Build(projectFullPath, restore, target is null ? Array.Empty() : [target], projectCollection, globalProperties, buildOutput, out targetOutputs);
+ }
+
+ public static bool TryBuild(
+ string projectFullPath,
+ ProjectCollection projectCollection,
+ BuildOutput buildOutput,
+ out IDictionary? targetOutputs,
+ bool restore = false,
+ string[]? targets = null,
+ IDictionary? globalProperties = null)
+ {
+ return Build(projectFullPath, restore, targets ?? Array.Empty(), projectCollection, globalProperties, buildOutput, out targetOutputs);
+ }
+
+ public static bool TryBuild(
+ ProjectInstance projectInstance,
+ ProjectCollection projectCollection,
+ BuildOutput buildOutput,
+ out IDictionary? targetOutputs,
+ string? target = null,
+ IDictionary? globalProperties = null)
+ {
+ return Build(projectInstance, target is null ? Array.Empty() : [target], projectCollection, globalProperties, buildOutput, out targetOutputs);
+ }
+
+ public static bool TryBuild(
+ ProjectInstance projectInstance,
+ ProjectCollection projectCollection,
+ BuildOutput buildOutput,
+ out IDictionary? targetOutputs,
+ string[]? targets = null,
+ IDictionary? globalProperties = null)
+ {
+ return Build(projectInstance, targets ?? Array.Empty(), projectCollection, globalProperties, buildOutput, out targetOutputs);
+ }
+
+ private static bool Build(
+ string projectFullPath,
+ bool restore,
+ string[] targets,
+ ProjectCollection projectCollection,
+ IDictionary? globalProperties,
+ BuildOutput buildOutput,
+ out IDictionary? targetOutputs)
+ {
+ targetOutputs = null;
+
+ if (restore)
+ {
+ if (!Restore(projectFullPath, projectCollection, globalProperties, buildOutput, out _))
+ {
+ return false;
+ }
+ }
+
+ return BuildProjectFromFullPath(projectFullPath, targets, globalProperties, [.. projectCollection.Loggers, buildOutput], BuildRequestDataFlags.None, out targetOutputs);
+ }
+
+ private static bool Build(
+ ProjectInstance projectInstance,
+ string[] targets,
+ ProjectCollection projectCollection,
+ IDictionary? globalProperties,
+ BuildOutput buildOutput,
+ out IDictionary? targetOutputs)
+ {
+ targetOutputs = null;
+
+ return BuildProjectFromProjectInstance(projectInstance, targets, globalProperties, [.. projectCollection.Loggers, buildOutput], BuildRequestDataFlags.None, out targetOutputs);
+ }
+
+ private static bool BuildProjectFromProjectInstance(
+ ProjectInstance projectInstance,
+ string[] targets,
+ IDictionary? globalProperties,
+ IEnumerable loggers,
+ BuildRequestDataFlags buildRequestDataFlags,
+ out IDictionary? targetOutputs)
+ {
+ targetOutputs = null;
+
+ BuildResult buildResult = BuildManagerHost.Build(
+ projectInstance,
+ targets,
+ globalProperties ?? EmptyGlobalProperties,
+ loggers,
+ buildRequestDataFlags);
+
+ if (buildResult.Exception != null)
+ {
+ throw buildResult.Exception;
+ }
+
+ targetOutputs = buildResult.ResultsByTarget;
+
+ return buildResult.OverallResult == BuildResultCode.Success;
+ }
+
+ private static bool BuildProjectFromFullPath(
+ string projectFullPath,
+ string[] targets,
+ IDictionary? globalProperties,
+ IEnumerable loggers,
+ BuildRequestDataFlags buildRequestDataFlags,
+ out IDictionary? targetOutputs)
+ {
+ targetOutputs = null;
+
+ BuildResult buildResult = BuildManagerHost.Build(
+ projectFullPath,
+ targets,
+ GetGlobalProperties(globalProperties),
+ loggers,
+ buildRequestDataFlags);
+
+ if (buildResult.Exception != null)
+ {
+ throw buildResult.Exception;
+ }
+
+ if (targetOutputs != null)
+ {
+ foreach (KeyValuePair targetResult in buildResult.ResultsByTarget)
+ {
+ targetOutputs[targetResult.Key] = targetResult.Value;
+ }
+ }
+ else
+ {
+ targetOutputs = buildResult.ResultsByTarget;
+ }
+
+ return buildResult.OverallResult == BuildResultCode.Success;
+
+#if NET8_0
+ IDictionary
+#else
+ IDictionary
+#endif
+ GetGlobalProperties(IDictionary? globalProperties)
+ {
+#if NET8_0
+ return globalProperties ?? EmptyGlobalProperties;
+#else
+ if (globalProperties is null)
+ {
+ return EmptyGlobalPropertiesWithNull;
+ }
+
+ Dictionary finalGlobalProperties = new(globalProperties.Count);
+
+ foreach (var kvp in globalProperties)
+ {
+ finalGlobalProperties[kvp.Key] = kvp.Value;
+ }
+
+ return finalGlobalProperties;
+#endif
+ }
+ }
+ }
+}
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/ExtensionMethods.cs b/src/Microsoft.Build.Utilities.ProjectCreation/ExtensionMethods.cs
index fb90939..9b2706a 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/ExtensionMethods.cs
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/ExtensionMethods.cs
@@ -73,22 +73,6 @@ public static IEnumerable AsEnumerable(this T? item)
return result;
}
- ///
- /// Gets the current object as an array of objects.
- ///
- /// The type of the object.
- /// The item to make into an array.
- /// An array of T objects.
- [DebuggerStepThrough]
- public static T[] ToArrayWithSingleElement(this T item)
- where T : class
- {
- return new[]
- {
- item,
- };
- }
-
///
/// Creates an entry in the current based on the specified .
///
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/Microsoft.Build.Utilities.ProjectCreation.csproj b/src/Microsoft.Build.Utilities.ProjectCreation/Microsoft.Build.Utilities.ProjectCreation.csproj
index 775b828..5389f92 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/Microsoft.Build.Utilities.ProjectCreation.csproj
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/Microsoft.Build.Utilities.ProjectCreation.csproj
@@ -32,6 +32,7 @@
+
@@ -55,6 +56,6 @@
-
+
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.Build.cs b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.Build.cs
index 87ca947..c0713b5 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.Build.cs
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.Build.cs
@@ -20,7 +20,7 @@ public partial class ProjectCreator
/// The current .
public ProjectCreator TryBuild(string target, out bool result)
{
- return TryBuild(target, null, out result);
+ return TryBuild(target, globalProperties: null, out result);
}
///
@@ -44,7 +44,7 @@ public ProjectCreator TryBuild(string target, IDictionary? globa
/// The current .
public ProjectCreator TryBuild(bool restore, string target, out bool result)
{
- return TryBuild(restore, target, null, out result);
+ return TryBuild(restore, target, globalProperties: null, out result);
}
///
@@ -67,7 +67,7 @@ public ProjectCreator TryBuild(bool restore, string target, IDictionaryThe current .
public ProjectCreator TryBuild(string target, out bool result, out BuildOutput buildOutput)
{
- return TryBuild(target, null, out result, out buildOutput);
+ return TryBuild(target, globalProperties: null, out result, out buildOutput);
}
///
@@ -107,7 +107,7 @@ public ProjectCreator TryBuild(string target, IDictionary? globa
/// The current .
public ProjectCreator TryBuild(bool restore, string target, out bool result, out BuildOutput buildOutput)
{
- return TryBuild(restore, target, null, out result, out buildOutput);
+ return TryBuild(restore, target, globalProperties: null, out result, out buildOutput);
}
///
@@ -123,7 +123,7 @@ public ProjectCreator TryBuild(bool restore, string target, IDictionary? global
}
}
- Build(null, globalProperties: globalProperties, out result, out _, out _);
+ result = Build(null, globalProperties: globalProperties, out _, out _);
return this;
}
@@ -231,7 +231,7 @@ public ProjectCreator TryBuild(bool restore, IDictionary? global
{
buildOutput = BuildOutput.Create();
- Build(restore, null, globalProperties, buildOutput, out result, out _);
+ result = Build(restore, null, globalProperties, buildOutput, out _);
return this;
}
@@ -347,7 +347,7 @@ public ProjectCreator TryBuild(bool restore, string[] targets, IDictionary? globalProperties,
{
buildOutput = BuildOutput.Create();
- Restore(globalProperties, buildOutput, out result, out targetOutputs);
+ result = Restore(globalProperties, buildOutput, out targetOutputs);
return this;
}
- private void Build(string[]? targets, IDictionary? globalProperties, out bool result, out BuildOutput buildOutput, out IDictionary? targetOutputs)
+ private bool Build(string[]? targets, IDictionary? globalProperties, out BuildOutput buildOutput, out IDictionary? targetOutputs)
{
buildOutput = BuildOutput.Create();
- Build(restore: false, targets, globalProperties, buildOutput, out result, out targetOutputs);
+ return Build(restore: false, targets, globalProperties, buildOutput, out targetOutputs);
}
- private void Build(bool restore, string[]? targets, IDictionary? globalProperties, BuildOutput buildOutput, out bool result, out IDictionary? targetOutputs)
+ private bool Build(bool restore, string[]? targets, IDictionary? globalProperties, BuildOutput buildOutput, out IDictionary? targetOutputs)
{
targetOutputs = null;
if (restore)
{
- Restore(globalProperties, buildOutput, out result, out targetOutputs);
-
- if (!result)
+ if (!Restore(globalProperties, buildOutput, out targetOutputs))
{
- return;
+ return false;
}
}
@@ -515,60 +513,18 @@ private void Build(bool restore, string[]? targets, IDictionary?
projectInstance = ProjectInstance;
}
- BuildResult buildResult = BuildManagerHost.Build(
- projectInstance,
- targets!,
- globalProperties!,
- new List(ProjectCollection.Loggers.Concat(buildOutput.AsEnumerable())),
- BuildRequestDataFlags.None);
-
- result = buildResult.OverallResult == BuildResultCode.Success;
-
- if (targetOutputs != null)
- {
- foreach (KeyValuePair targetResult in buildResult.ResultsByTarget)
- {
- targetOutputs[targetResult.Key] = targetResult.Value;
- }
- }
- else
- {
- targetOutputs = buildResult.ResultsByTarget;
- }
+ bool result = BuildHost.TryBuild(projectInstance, ProjectCollection, buildOutput, out targetOutputs, targets: targets);
ResetProjectInstance();
+
+ return result;
}
- private void Restore(IDictionary? globalProperties, BuildOutput buildOutput, out bool result, out IDictionary targetOutputs)
+ private bool Restore(IDictionary? globalProperties, BuildOutput buildOutput, out IDictionary? targetOutputs)
{
Save();
- // IMPORTANT: Make a copy of the global properties here so as not to modify the ones passed in
-#if NET8_0
- Dictionary restoreGlobalProperties =
-#else
- Dictionary restoreGlobalProperties =
-#endif
- new(globalProperties ?? _globalProperties ?? ProjectCollection.GlobalProperties);
-
- restoreGlobalProperties["ExcludeRestorePackageImports"] = "true";
- restoreGlobalProperties["MSBuildRestoreSessionId"] = Guid.NewGuid().ToString("D");
-
- BuildResult buildResult = BuildManagerHost.Build(
- FullPath,
- new[] { "Restore" },
- restoreGlobalProperties,
- new List(ProjectCollection.Loggers.Concat(buildOutput.AsEnumerable())),
- BuildRequestDataFlags.ClearCachesAfterBuild | BuildRequestDataFlags.SkipNonexistentTargets | BuildRequestDataFlags.IgnoreMissingEmptyAndInvalidImports);
-
- targetOutputs = buildResult.ResultsByTarget;
-
- if (buildResult.Exception != null)
- {
- throw buildResult.Exception;
- }
-
- result = buildResult.OverallResult == BuildResultCode.Success;
+ return BuildHost.Restore(FullPath, ProjectCollection, globalProperties ?? _globalProperties, buildOutput, out targetOutputs);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.Templates.cs b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.Templates.cs
index 7f2a3e2..02aa92b 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.Templates.cs
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.Templates.cs
@@ -7,7 +7,7 @@ namespace Microsoft.Build.Utilities.ProjectCreation
public partial class ProjectCreator
{
///
- /// Gets a set of project templates that can be used to generate complete projects.
+ /// Gets a set of templates that can be used to generate complete projects.
///
public static ProjectCreatorTemplates Templates { get; } = new ProjectCreatorTemplates();
}
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.UsingTasks.cs b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.UsingTasks.cs
index 195b4ea..0688f4c 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.UsingTasks.cs
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.UsingTasks.cs
@@ -104,7 +104,6 @@ public ProjectCreator UsingTaskParameter(string name, string? parameterType = nu
_lastUsingTask.AddParameterGroup();
}
- // ReSharper disable once PossibleNullReferenceException
_lastUsingTask!.ParameterGroup!.AddParameter(
name,
output?.ToString() ?? string.Empty,
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.cs b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.cs
index 21f4491..f965c80 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.cs
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreator.cs
@@ -185,4 +185,4 @@ protected T AddTopLevelElement(T element)
return element;
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/Templates/LegacyCsproj.cs b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreatorTemplates/LegacyCsproj.cs
similarity index 99%
rename from src/Microsoft.Build.Utilities.ProjectCreation/Templates/LegacyCsproj.cs
rename to src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreatorTemplates/LegacyCsproj.cs
index d66e43c..76059b9 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/Templates/LegacyCsproj.cs
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreatorTemplates/LegacyCsproj.cs
@@ -7,7 +7,6 @@
using System.Collections.Generic;
using System.IO;
-// ReSharper disable once CheckNamespace
namespace Microsoft.Build.Utilities.ProjectCreation
{
///
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/Templates/LogsMessage.cs b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreatorTemplates/LogsMessage.cs
similarity index 98%
rename from src/Microsoft.Build.Utilities.ProjectCreation/Templates/LogsMessage.cs
rename to src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreatorTemplates/LogsMessage.cs
index bc5df53..f133c3a 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/Templates/LogsMessage.cs
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreatorTemplates/LogsMessage.cs
@@ -5,7 +5,6 @@
using Microsoft.Build.Evaluation;
using Microsoft.Build.Framework;
-// ReSharper disable once CheckNamespace
namespace Microsoft.Build.Utilities.ProjectCreation
{
public partial class ProjectCreatorTemplates
@@ -53,4 +52,4 @@ public ProjectCreator LogsMessage(
.TaskMessage(text, importance, condition);
}
}
-}
\ No newline at end of file
+}
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/Templates/SdkCsproj.cs b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreatorTemplates/SdkCsproj.cs
similarity index 99%
rename from src/Microsoft.Build.Utilities.ProjectCreation/Templates/SdkCsproj.cs
rename to src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreatorTemplates/SdkCsproj.cs
index e752658..0ab316b 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/Templates/SdkCsproj.cs
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/ProjectCreatorTemplates/SdkCsproj.cs
@@ -7,7 +7,6 @@
using System.Collections.Generic;
using System.Linq;
-// ReSharper disable once CheckNamespace
namespace Microsoft.Build.Utilities.ProjectCreation
{
public partial class ProjectCreatorTemplates
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Shipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Shipped.txt
index 37c0dfd..d9d0adb 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Shipped.txt
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Shipped.txt
@@ -290,7 +290,6 @@ static Microsoft.Build.Utilities.ProjectCreation.BuildOutput.Create() -> Microso
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.AsEnumerable(this T? item) -> System.Collections.Generic.IEnumerable!
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.Merge(this System.Collections.Generic.IDictionary? first, System.Collections.Generic.IDictionary! second) -> System.Collections.Generic.IDictionary!
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.Merge(this System.Collections.Generic.IDictionary? first, System.Collections.Generic.IDictionary! second, System.Collections.Generic.IEqualityComparer! comparer) -> System.Collections.Generic.IDictionary!
-static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.ToArrayWithSingleElement(this T! item) -> T![]!
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.AssemblyResolve(System.Runtime.Loader.AssemblyLoadContext! assemblyLoadContext, System.Reflection.AssemblyName! requestedAssemblyName) -> System.Reflection.Assembly?
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.DotNetSdksPath.get -> string?
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.MSBuildExePath.get -> string?
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Unshipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Unshipped.txt
index ab058de..cdc99ba 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Unshipped.txt
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net10.0/PublicAPI.Unshipped.txt
@@ -1 +1,52 @@
#nullable enable
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Configuration(string! configuration) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Folder(string! path) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.FullPath.get -> string!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Platform(string! platform) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, Microsoft.VisualStudio.SolutionPersistence.Model.SolutionFolderModel? folder, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(params Microsoft.Build.Utilities.ProjectCreation.ProjectCreator![]! projects) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.ProjectCollection.get -> Microsoft.Build.Evaluation.ProjectCollection!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Save() -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string![]! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string![]! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IEnumerable! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IEnumerable! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string![]! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string![]! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.Dictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IEnumerable! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IEnumerable! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryProject(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, Microsoft.VisualStudio.SolutionPersistence.Model.SolutionFolderModel? folder, out Microsoft.VisualStudio.SolutionPersistence.Model.SolutionProjectModel! projectInSolution, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryProject(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, out Microsoft.VisualStudio.SolutionPersistence.Model.SolutionProjectModel! projectInSolution, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates.DotNet(string! path) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates.SolutionCreatorTemplates() -> void
+static Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Create(string! path, Microsoft.Build.Evaluation.ProjectCollection? projectCollection = null, System.Collections.Generic.IDictionary? globalProperties = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+static Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Templates.get -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates!
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Shipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Shipped.txt
index 525fa50..63940ac 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Shipped.txt
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Shipped.txt
@@ -290,7 +290,6 @@ static Microsoft.Build.Utilities.ProjectCreation.BuildOutput.Create() -> Microso
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.AsEnumerable(this T? item) -> System.Collections.Generic.IEnumerable!
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.Merge(this System.Collections.Generic.IDictionary? first, System.Collections.Generic.IDictionary! second) -> System.Collections.Generic.IDictionary!
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.Merge(this System.Collections.Generic.IDictionary? first, System.Collections.Generic.IDictionary! second, System.Collections.Generic.IEqualityComparer! comparer) -> System.Collections.Generic.IDictionary!
-static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.ToArrayWithSingleElement(this T! item) -> T![]!
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.AssemblyResolve(object? sender, System.ResolveEventArgs! args) -> System.Reflection.Assembly?
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.DotNetSdksPath.get -> string?
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.MSBuildExePath.get -> string?
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Unshipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Unshipped.txt
index ab058de..cdc99ba 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Unshipped.txt
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net472/PublicAPI.Unshipped.txt
@@ -1 +1,52 @@
#nullable enable
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Configuration(string! configuration) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Folder(string! path) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.FullPath.get -> string!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Platform(string! platform) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, Microsoft.VisualStudio.SolutionPersistence.Model.SolutionFolderModel? folder, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(params Microsoft.Build.Utilities.ProjectCreation.ProjectCreator![]! projects) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.ProjectCollection.get -> Microsoft.Build.Evaluation.ProjectCollection!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Save() -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string![]! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string![]! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IEnumerable! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IEnumerable! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string![]! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string![]! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.Dictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IEnumerable! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IEnumerable! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryProject(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, Microsoft.VisualStudio.SolutionPersistence.Model.SolutionFolderModel? folder, out Microsoft.VisualStudio.SolutionPersistence.Model.SolutionProjectModel! projectInSolution, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryProject(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, out Microsoft.VisualStudio.SolutionPersistence.Model.SolutionProjectModel! projectInSolution, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates.DotNet(string! path) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates.SolutionCreatorTemplates() -> void
+static Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Create(string! path, Microsoft.Build.Evaluation.ProjectCollection? projectCollection = null, System.Collections.Generic.IDictionary? globalProperties = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+static Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Templates.get -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates!
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Shipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Shipped.txt
index 37c0dfd..d9d0adb 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Shipped.txt
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Shipped.txt
@@ -290,7 +290,6 @@ static Microsoft.Build.Utilities.ProjectCreation.BuildOutput.Create() -> Microso
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.AsEnumerable(this T? item) -> System.Collections.Generic.IEnumerable!
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.Merge(this System.Collections.Generic.IDictionary? first, System.Collections.Generic.IDictionary! second) -> System.Collections.Generic.IDictionary!
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.Merge(this System.Collections.Generic.IDictionary? first, System.Collections.Generic.IDictionary! second, System.Collections.Generic.IEqualityComparer! comparer) -> System.Collections.Generic.IDictionary!
-static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.ToArrayWithSingleElement(this T! item) -> T![]!
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.AssemblyResolve(System.Runtime.Loader.AssemblyLoadContext! assemblyLoadContext, System.Reflection.AssemblyName! requestedAssemblyName) -> System.Reflection.Assembly?
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.DotNetSdksPath.get -> string?
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.MSBuildExePath.get -> string?
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Unshipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Unshipped.txt
index ab058de..cdc99ba 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Unshipped.txt
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net8.0/PublicAPI.Unshipped.txt
@@ -1 +1,52 @@
#nullable enable
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Configuration(string! configuration) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Folder(string! path) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.FullPath.get -> string!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Platform(string! platform) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, Microsoft.VisualStudio.SolutionPersistence.Model.SolutionFolderModel? folder, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(params Microsoft.Build.Utilities.ProjectCreation.ProjectCreator![]! projects) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.ProjectCollection.get -> Microsoft.Build.Evaluation.ProjectCollection!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Save() -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string![]! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string![]! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IEnumerable! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IEnumerable! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string![]! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string![]! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.Dictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IEnumerable! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IEnumerable! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryProject(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, Microsoft.VisualStudio.SolutionPersistence.Model.SolutionFolderModel? folder, out Microsoft.VisualStudio.SolutionPersistence.Model.SolutionProjectModel! projectInSolution, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryProject(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, out Microsoft.VisualStudio.SolutionPersistence.Model.SolutionProjectModel! projectInSolution, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates.DotNet(string! path) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates.SolutionCreatorTemplates() -> void
+static Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Create(string! path, Microsoft.Build.Evaluation.ProjectCollection? projectCollection = null, System.Collections.Generic.IDictionary? globalProperties = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+static Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Templates.get -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates!
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net9.0/PublicAPI.Shipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net9.0/PublicAPI.Shipped.txt
index 37c0dfd..d9d0adb 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net9.0/PublicAPI.Shipped.txt
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net9.0/PublicAPI.Shipped.txt
@@ -290,7 +290,6 @@ static Microsoft.Build.Utilities.ProjectCreation.BuildOutput.Create() -> Microso
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.AsEnumerable(this T? item) -> System.Collections.Generic.IEnumerable!
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.Merge(this System.Collections.Generic.IDictionary? first, System.Collections.Generic.IDictionary! second) -> System.Collections.Generic.IDictionary!
static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.Merge(this System.Collections.Generic.IDictionary? first, System.Collections.Generic.IDictionary! second, System.Collections.Generic.IEqualityComparer! comparer) -> System.Collections.Generic.IDictionary!
-static Microsoft.Build.Utilities.ProjectCreation.ExtensionMethods.ToArrayWithSingleElement(this T! item) -> T![]!
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.AssemblyResolve(System.Runtime.Loader.AssemblyLoadContext! assemblyLoadContext, System.Reflection.AssemblyName! requestedAssemblyName) -> System.Reflection.Assembly?
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.DotNetSdksPath.get -> string?
static Microsoft.Build.Utilities.ProjectCreation.MSBuildAssemblyResolver.MSBuildExePath.get -> string?
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net9.0/PublicAPI.Unshipped.txt b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net9.0/PublicAPI.Unshipped.txt
index ab058de..cdc99ba 100644
--- a/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net9.0/PublicAPI.Unshipped.txt
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/PublicAPI/net9.0/PublicAPI.Unshipped.txt
@@ -1 +1,52 @@
#nullable enable
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Configuration(string! configuration) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Folder(string! path) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.FullPath.get -> string!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Platform(string! platform) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, Microsoft.VisualStudio.SolutionPersistence.Model.SolutionFolderModel? folder, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Project(params Microsoft.Build.Utilities.ProjectCreation.ProjectCreator![]! projects) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.ProjectCollection.get -> Microsoft.Build.Evaluation.ProjectCollection!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Save() -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string![]! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, string![]! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IEnumerable! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(bool restore, System.Collections.Generic.IEnumerable! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string! target, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string![]! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(string![]! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.Dictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IEnumerable! targets, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryBuild(System.Collections.Generic.IEnumerable! targets, System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryProject(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, Microsoft.VisualStudio.SolutionPersistence.Model.SolutionFolderModel? folder, out Microsoft.VisualStudio.SolutionPersistence.Model.SolutionProjectModel! projectInSolution, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryProject(Microsoft.Build.Utilities.ProjectCreation.ProjectCreator! project, out Microsoft.VisualStudio.SolutionPersistence.Model.SolutionProjectModel! projectInSolution, string? projectTypeName = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.TryRestore(System.Collections.Generic.IDictionary? globalProperties, out bool result, out Microsoft.Build.Utilities.ProjectCreation.BuildOutput! buildOutput, out System.Collections.Generic.IDictionary? targetOutputs) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates.DotNet(string! path) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates.SolutionCreatorTemplates() -> void
+static Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Create(string! path, Microsoft.Build.Evaluation.ProjectCollection? projectCollection = null, System.Collections.Generic.IDictionary? globalProperties = null) -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreator!
+static Microsoft.Build.Utilities.ProjectCreation.SolutionCreator.Templates.get -> Microsoft.Build.Utilities.ProjectCreation.SolutionCreatorTemplates!
diff --git a/src/Microsoft.Build.Utilities.ProjectCreation/SolutionCreator.Build.cs b/src/Microsoft.Build.Utilities.ProjectCreation/SolutionCreator.Build.cs
new file mode 100644
index 0000000..e9a6e64
--- /dev/null
+++ b/src/Microsoft.Build.Utilities.ProjectCreation/SolutionCreator.Build.cs
@@ -0,0 +1,518 @@
+// Copyright (c) Jeff Kluge. All rights reserved.
+//
+// Licensed under the MIT license.
+
+using Microsoft.Build.Evaluation;
+using Microsoft.Build.Execution;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Microsoft.Build.Utilities.ProjectCreation
+{
+ public partial class SolutionCreator
+ {
+ ///
+ /// Saves the current Visual Studio solution and attempts to build it.
+ ///
+ /// The name of the target to build.
+ /// A value indicating the result of the build.
+ /// The current .
+ public SolutionCreator TryBuild(string target, out bool result)
+ {
+ return TryBuild(target, globalProperties: null, out result);
+ }
+
+ ///
+ /// Saves the current Visual Studio solution and attempts to build it.
+ ///
+ /// The name of the target to build.
+ /// Global properties to use when building the target.
+ /// A value indicating the result of the build.
+ /// The current .
+ public SolutionCreator TryBuild(string target, IDictionary? globalProperties, out bool result)
+ {
+ return TryBuild(restore: false, target, globalProperties, out result);
+ }
+
+ ///
+ /// Saves the current Visual Studio solution and attempts to build it.
+ ///
+ /// A value indicating whether or not the Visual Studio solution should be restored before building.
+ /// The name of the target to build.
+ /// A value indicating the result of the build.
+ /// The current .
+ public SolutionCreator TryBuild(bool restore, string target, out bool result)
+ {
+ return TryBuild(restore, target, null, out result);
+ }
+
+ ///
+ /// Saves the current Visual Studio solution and attempts to build it.
+ ///
+ /// A value indicating whether or not the Visual Studio solution should be restored before building.
+ /// The name of the target to build.
+ /// Global properties to use when building the target.
+ /// A value indicating the result of the build.
+ /// The current .
+ public SolutionCreator TryBuild(bool restore, string target, IDictionary? globalProperties, out bool result)
+ {
+ if (restore)
+ {
+ TryRestore(out result);
+
+ if (!result)
+ {
+ return this;
+ }
+ }
+
+ result = Build([target], globalProperties, out _, out _);
+
+ return this;
+ }
+
+ ///
+ /// Saves the current Visual Studio solution and attempts to build it.
+ ///
+ /// The name of the target to build.
+ /// A value indicating the result of the build.
+ /// A object that captured the logging from the build.
+ /// The current