-
Notifications
You must be signed in to change notification settings - Fork 1.2k
sln-add: Support for slnx #44570
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
sln-add: Support for slnx #44570
Changes from 55 commits
1d1c4b0
bdff950
01b3031
277a1d7
5e6e3ff
b4ac6a4
3f967f7
3d52972
de95e6d
a090ad4
c03cad7
90f4248
4929979
f88c3eb
a900dc3
c394d75
c8e5996
039e694
cef4d22
51294e9
6aee575
e168158
07343f9
af2917a
6d8c3fe
b195880
93775e8
3195e02
8975dbc
2e9b5ea
76a2f1d
60d434c
f79ddf3
d90d9df
63c1fda
6f0cc41
7cf1a37
0c83e51
32cae25
0b3b696
a4a9f74
14bac00
96274cf
68f8de2
f1a735f
9492a03
6f8c166
13c8cd1
2dd69b0
6e62402
8992fce
12533a5
d8fbc8e
c3bac1d
f7a4fb7
5b5190e
931d2df
41c7c38
b0bff17
96cb8a0
0f118ef
bf80cbd
74193d2
5205f1b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -2,143 +2,183 @@ | |
| // The .NET Foundation licenses this file to you under the MIT license. | ||
|
|
||
| using System.CommandLine; | ||
| using Microsoft.Build.Construction; | ||
| using Microsoft.Build.Exceptions; | ||
| using Microsoft.Build.Execution; | ||
| using Microsoft.DotNet.Cli; | ||
| using Microsoft.DotNet.Cli.Sln.Internal; | ||
| using Microsoft.DotNet.Cli.Utils; | ||
| using Microsoft.DotNet.Tools.Common; | ||
| using Microsoft.VisualStudio.SolutionPersistence; | ||
| using Microsoft.VisualStudio.SolutionPersistence.Model; | ||
| using Microsoft.VisualStudio.SolutionPersistence.Serializer.SlnV12; | ||
|
|
||
| namespace Microsoft.DotNet.Tools.Sln.Add | ||
| { | ||
| internal class AddProjectToSolutionCommand : CommandBase | ||
| { | ||
| private readonly string _fileOrDirectory; | ||
| private readonly bool _inRoot; | ||
| private readonly IList<string> _relativeRootSolutionFolders; | ||
| private readonly IReadOnlyCollection<string> _arguments; | ||
| private readonly IReadOnlyCollection<string> _projects; | ||
| private readonly string? _solutionFolderPath; | ||
|
|
||
| private static string GetSolutionFolderPathWithForwardSlashes(string path) | ||
| { | ||
| // SolutionModel::AddFolder expects paths to have leading, trailing and inner forward slashes | ||
| return "/" + string.Join("/", PathUtility.GetPathWithDirectorySeparator(path).Split(Path.DirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries)) + "/"; | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
| public AddProjectToSolutionCommand(ParseResult parseResult) : base(parseResult) | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| { | ||
| _fileOrDirectory = parseResult.GetValue(SlnCommandParser.SlnArgument); | ||
|
|
||
| _arguments = parseResult.GetValue(SlnAddParser.ProjectPathArgument)?.ToArray() ?? (IReadOnlyCollection<string>)Array.Empty<string>(); | ||
|
|
||
| _projects = (IReadOnlyCollection<string>)(parseResult.GetValue(SlnAddParser.ProjectPathArgument) ?? []); | ||
| _inRoot = parseResult.GetValue(SlnAddParser.InRootOption); | ||
| string relativeRoot = parseResult.GetValue(SlnAddParser.SolutionFolderOption); | ||
|
|
||
| SlnArgumentValidator.ParseAndValidateArguments(_fileOrDirectory, _arguments, SlnArgumentValidator.CommandType.Add, _inRoot, relativeRoot); | ||
|
|
||
| bool hasRelativeRoot = !string.IsNullOrEmpty(relativeRoot); | ||
|
|
||
| if (hasRelativeRoot) | ||
| { | ||
| relativeRoot = PathUtility.GetPathWithDirectorySeparator(relativeRoot); | ||
| _relativeRootSolutionFolders = relativeRoot.Split(Path.DirectorySeparatorChar, StringSplitOptions.RemoveEmptyEntries); | ||
| } | ||
| else | ||
| { | ||
| _relativeRootSolutionFolders = null; | ||
| } | ||
| _solutionFolderPath = parseResult.GetValue(SlnAddParser.SolutionFolderOption); | ||
| SlnArgumentValidator.ParseAndValidateArguments(_fileOrDirectory, _projects, SlnArgumentValidator.CommandType.Add, _inRoot, _solutionFolderPath); | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
|
|
||
| public override int Execute() | ||
| { | ||
| SlnFile slnFile = SlnFileFactory.CreateFromFileOrDirectory(_fileOrDirectory); | ||
|
|
||
| var arguments = (_parseResult.GetValue<IEnumerable<string>>(SlnAddParser.ProjectPathArgument) ?? Array.Empty<string>()).ToList().AsReadOnly(); | ||
| if (arguments.Count == 0) | ||
| string solutionFileFullPath = SlnCommandParser.GetSlnFileFullPath(_fileOrDirectory); | ||
| if (_projects.Count == 0) | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| { | ||
| throw new GracefulException(CommonLocalizableStrings.SpecifyAtLeastOneProjectToAdd); | ||
| } | ||
|
|
||
| PathUtility.EnsureAllPathsExist(arguments, CommonLocalizableStrings.CouldNotFindProjectOrDirectory, true); | ||
|
|
||
| var fullProjectPaths = _arguments.Select(p => | ||
| try | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| { | ||
| var fullPath = Path.GetFullPath(p); | ||
| return Directory.Exists(fullPath) ? | ||
| MsbuildProject.GetProjectFileFromDirectory(fullPath).FullName : | ||
| fullPath; | ||
| }).ToList(); | ||
|
|
||
| var preAddProjectCount = slnFile.Projects.Count; | ||
|
|
||
| foreach (var fullProjectPath in fullProjectPaths) | ||
| PathUtility.EnsureAllPathsExist(_projects, CommonLocalizableStrings.CouldNotFindProjectOrDirectory, true); | ||
| IEnumerable<string> fullProjectPaths = _projects.Select(project => | ||
| { | ||
| var fullPath = Path.GetFullPath(project); | ||
| return Directory.Exists(fullPath) ? MsbuildProject.GetProjectFileFromDirectory(fullPath).FullName : fullPath; | ||
| }); | ||
| AddProjectsToSolutionAsync(solutionFileFullPath, fullProjectPaths, CancellationToken.None).Wait(); | ||
edvilme marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
edvilme marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| return 0; | ||
| } | ||
| catch (GracefulException) | ||
edvilme marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| { | ||
| // Identify the intended solution folders | ||
| var solutionFolders = DetermineSolutionFolder(slnFile, fullProjectPath); | ||
|
|
||
| slnFile.AddProject(fullProjectPath, solutionFolders); | ||
| throw; | ||
| } | ||
|
|
||
| if (slnFile.Projects.Count > preAddProjectCount) | ||
| catch (Exception ex) when (ex is not GracefulException) | ||
| { | ||
| slnFile.Write(); | ||
| { | ||
| if (ex is SolutionException || ex.InnerException is SolutionException) | ||
| { | ||
| throw new GracefulException(CommonLocalizableStrings.InvalidSolutionFormatString, solutionFileFullPath, ex.Message); | ||
| } | ||
| throw new GracefulException(ex.Message, ex); | ||
| } | ||
| } | ||
|
|
||
| return 0; | ||
| } | ||
|
|
||
| private static IList<string> GetSolutionFoldersFromProjectPath(string projectFilePath) | ||
| private async Task AddProjectsToSolutionAsync(string solutionFileFullPath, IEnumerable<string> projectPaths, CancellationToken cancellationToken) | ||
| { | ||
| var solutionFolders = new List<string>(); | ||
|
|
||
| if (!IsPathInTreeRootedAtSolutionDirectory(projectFilePath)) | ||
| return solutionFolders; | ||
|
|
||
| var currentDirString = $".{Path.DirectorySeparatorChar}"; | ||
| if (projectFilePath.StartsWith(currentDirString)) | ||
| ISolutionSerializer serializer = SlnCommandParser.GetSolutionSerializer(solutionFileFullPath); | ||
nagilson marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| SolutionModel solution = await serializer.OpenAsync(solutionFileFullPath, cancellationToken); | ||
| // set UTF8 BOM encoding for .sln | ||
| if (serializer is ISolutionSerializer<SlnV12SerializerSettings> v12Serializer) | ||
nagilson marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| { | ||
| projectFilePath = projectFilePath.Substring(currentDirString.Length); | ||
| solution.SerializerExtension = v12Serializer.CreateModelExtension(new() | ||
| { | ||
| Encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier: true) | ||
| }); | ||
| } | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| var projectDirectoryPath = TrimProject(projectFilePath); | ||
| if (string.IsNullOrEmpty(projectDirectoryPath)) | ||
| return solutionFolders; | ||
|
|
||
| var solutionFoldersPath = TrimProjectDirectory(projectDirectoryPath); | ||
| if (string.IsNullOrEmpty(solutionFoldersPath)) | ||
| return solutionFolders; | ||
|
|
||
| solutionFolders.AddRange(solutionFoldersPath.Split(Path.DirectorySeparatorChar)); | ||
|
|
||
| return solutionFolders; | ||
| } | ||
|
|
||
| private IList<string> DetermineSolutionFolder(SlnFile slnFile, string fullProjectPath) | ||
| { | ||
| if (_inRoot) | ||
| // Set default configurations and platforms for sln file | ||
| foreach (var platform in new[]{ "Any CPU", "x64", "x86" }) | ||
edvilme marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| { | ||
| // The user requested all projects go to the root folder | ||
| return null; | ||
| solution.AddPlatform(platform); | ||
| } | ||
|
|
||
| if (_relativeRootSolutionFolders != null) | ||
| foreach (var buildType in new []{ "Debug", "Release" }) | ||
Forgind marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| { | ||
| // The user has specified an explicit root | ||
| return _relativeRootSolutionFolders; | ||
| solution.AddBuildType(buildType); | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
|
|
||
| // We determine the root for each individual project | ||
| var relativeProjectPath = Path.GetRelativePath( | ||
| PathUtility.EnsureTrailingSlash(slnFile.BaseDirectory), | ||
| fullProjectPath); | ||
| SolutionFolderModel? solutionFolder = (!_inRoot && _solutionFolderPath != null) | ||
| ? solution.AddFolder(GetSolutionFolderPathWithForwardSlashes(_solutionFolderPath)) | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| : null; | ||
|
|
||
| return GetSolutionFoldersFromProjectPath(relativeProjectPath); | ||
| foreach (var projectPath in projectPaths) | ||
| { | ||
| string relativePath = Path.GetRelativePath(Path.GetDirectoryName(solutionFileFullPath), projectPath); | ||
| try | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| { | ||
| AddProject(solution, relativePath, projectPath, solutionFolder); | ||
| } | ||
| catch (InvalidProjectFileException ex) | ||
| { | ||
| Reporter.Error.WriteLine(string.Format(CommonLocalizableStrings.InvalidProjectWithExceptionMessage, projectPath, ex.Message)); | ||
Forgind marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| } | ||
| catch (SolutionArgumentException ex) when (solution.FindProject(relativePath) != null || ex.Type == SolutionErrorType.DuplicateProjectName) | ||
| { | ||
| Reporter.Output.WriteLine(CommonLocalizableStrings.SolutionAlreadyContainsProject, solutionFileFullPath, relativePath); | ||
| } | ||
| } | ||
| if (solution.SolutionProjects.Count > 1) | ||
| { | ||
| // https://stackoverflow.com/a/14714485 | ||
| solution.RemoveProperties("HideSolutionNode"); | ||
| } | ||
| await serializer.SaveAsync(solutionFileFullPath, solution, cancellationToken); | ||
| } | ||
|
|
||
| private static bool IsPathInTreeRootedAtSolutionDirectory(string path) | ||
| private void AddProject(SolutionModel solution, string pathRelativeToSolutionFile, string fullPath, SolutionFolderModel solutionFolder) | ||
| { | ||
| return !path.StartsWith(".."); | ||
| } | ||
| // Open project instance to see if it is a valid project | ||
| ProjectRootElement projectRootElement = ProjectRootElement.Open(fullPath); | ||
| SolutionProjectModel project; | ||
| try | ||
| { | ||
| project = solution.AddProject(pathRelativeToSolutionFile, null, solutionFolder); | ||
| } | ||
| catch (SolutionArgumentException ex) when (ex.ParamName == "projectTypeName") | ||
| { | ||
| // If guid is not identified by vs-solutionpersistence, check in project element itself | ||
| var guid = projectRootElement.GetProjectTypeGuid(); | ||
| if (string.IsNullOrEmpty(guid)) | ||
| { | ||
| Reporter.Error.WriteLine(CommonLocalizableStrings.UnsupportedProjectType, fullPath); | ||
| return; | ||
| } | ||
| project = solution.AddProject(pathRelativeToSolutionFile, guid, solutionFolder); | ||
| } | ||
| // Generate intermediate solution folders | ||
nagilson marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| if (solutionFolder is null && !_inRoot) | ||
| { | ||
| var relativePathDirectory = Path.GetDirectoryName(pathRelativeToSolutionFile); | ||
edvilme marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| if (!string.IsNullOrEmpty(relativePathDirectory)) | ||
| { | ||
edvilme marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| SolutionFolderModel relativeSolutionFolder = solution.AddFolder(GetSolutionFolderPathWithForwardSlashes(relativePathDirectory)); | ||
| project.MoveToFolder(relativeSolutionFolder); | ||
Forgind marked this conversation as resolved.
Outdated
Show resolved
Hide resolved
|
||
| // Avoid duplicate folder/project names | ||
| if (project.Parent is not null && project.Parent.ActualDisplayName == project.ActualDisplayName) | ||
| { | ||
| solution.RemoveFolder(project.Parent); | ||
| } | ||
| } | ||
| } | ||
| // Add settings based on existing project instance | ||
nagilson marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ProjectInstance projectInstance = new ProjectInstance(projectRootElement); | ||
| string projectInstanceId = projectInstance.GetProjectId(); | ||
| if (!string.IsNullOrEmpty(projectInstanceId)) | ||
| { | ||
| project.Id = new Guid(projectInstanceId); | ||
| } | ||
| var projectInstanceBuildTypes = projectInstance.GetConfigurations(); | ||
| var projectInstancePlatforms = projectInstance.GetPlatforms(); | ||
|
|
||
| private static string TrimProject(string path) | ||
| { | ||
| return Path.GetDirectoryName(path); | ||
| } | ||
| foreach (var solutionPlatform in solution.Platforms) | ||
| { | ||
| var projectPlatform = projectInstancePlatforms.FirstOrDefault( | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| x => x.Replace(" ", string.Empty) == solutionPlatform.Replace(" ", string.Empty), projectInstancePlatforms.FirstOrDefault("Any CPU")); | ||
|
||
| project.AddProjectConfigurationRule(new ConfigurationRule(BuildDimension.Platform, "*", solutionPlatform, projectPlatform)); | ||
| } | ||
|
|
||
| private static string TrimProjectDirectory(string path) | ||
| { | ||
| return Path.GetDirectoryName(path); | ||
| foreach (var solutionBuildType in solution.BuildTypes) | ||
| { | ||
| var projectBuildType = projectInstanceBuildTypes.FirstOrDefault( | ||
edvilme marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| x => x.Replace(" ", string.Empty) == solutionBuildType.Replace(" ", string.Empty), projectInstanceBuildTypes.FirstOrDefault("Debug")); | ||
|
||
| project.AddProjectConfigurationRule(new ConfigurationRule(BuildDimension.BuildType, solutionBuildType, "*", projectBuildType)); | ||
| } | ||
|
|
||
| Reporter.Output.WriteLine(CommonLocalizableStrings.ProjectAddedToTheSolution, pathRelativeToSolutionFile); | ||
| } | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| <invalid> | ||
| </invalid> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| This is a test of an invalid solution. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,2 @@ | ||
| <invalid> | ||
| </invalid> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| <Solution> | ||
| <Configurations> | ||
| <Platform Name="Any CPU" /> | ||
| <Platform Name="x64" /> | ||
| <Platform Name="x86" /> | ||
| </Configurations> | ||
| </Solution> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||
| # Visual Studio 15 | ||
| VisualStudioVersion = 15.0.26006.2 | ||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||
| Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "App\App.csproj", "{7072A694-548F-4CAE-A58F-12D257D5F486}" | ||
| EndProject | ||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lib", "Lib\Lib.csproj", "__LIB_PROJECT_GUID__" | ||
| EndProject | ||
| Global | ||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||
| Debug|Any CPU = Debug|Any CPU | ||
| Debug|x64 = Debug|x64 | ||
| Debug|x86 = Debug|x86 | ||
| Release|Any CPU = Release|Any CPU | ||
| Release|x64 = Release|x64 | ||
| Release|x86 = Release|x86 | ||
| EndGlobalSection | ||
| GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x64.ActiveCfg = Debug|x64 | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x64.Build.0 = Debug|x64 | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x86.ActiveCfg = Debug|x86 | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Debug|x86.Build.0 = Debug|x86 | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|Any CPU.Build.0 = Release|Any CPU | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x64.ActiveCfg = Release|x64 | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x64.Build.0 = Release|x64 | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x86.ActiveCfg = Release|x86 | ||
| {7072A694-548F-4CAE-A58F-12D257D5F486}.Release|x86.Build.0 = Release|x86 | ||
| __LIB_PROJECT_GUID__.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Debug|x64.ActiveCfg = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Debug|x64.Build.0 = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Debug|x86.ActiveCfg = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Debug|x86.Build.0 = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|Any CPU.Build.0 = Release|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|x64.ActiveCfg = Release|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|x64.Build.0 = Release|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|x86.ActiveCfg = Release|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|x86.Build.0 = Release|Any CPU | ||
| EndGlobalSection | ||
| GlobalSection(SolutionProperties) = preSolution | ||
| HideSolutionNode = FALSE | ||
| EndGlobalSection | ||
| EndGlobal |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,12 @@ | ||
| <Solution> | ||
| <Configurations> | ||
| <Platform Name="Any CPU" /> | ||
| <Platform Name="x64" /> | ||
| <Platform Name="x86" /> | ||
| </Configurations> | ||
| <Project Path="App/App.csproj"> | ||
| <Platform Solution="*|x64" Project="x64" /> | ||
| <Platform Solution="*|x86" Project="x86" /> | ||
| </Project> | ||
| <Project Path="Lib/Lib.csproj" Id="__LIB_PROJECT_GUID__"/> | ||
| </Solution> |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,33 @@ | ||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||
| # Visual Studio 15 | ||
| VisualStudioVersion = 15.0.26006.2 | ||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lib", "Lib\Lib.csproj", "__LIB_PROJECT_GUID__" | ||
| EndProject | ||
| Global | ||
| GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||
| Debug|Any CPU = Debug|Any CPU | ||
| Debug|x64 = Debug|x64 | ||
| Debug|x86 = Debug|x86 | ||
| Release|Any CPU = Release|Any CPU | ||
| Release|x64 = Release|x64 | ||
| Release|x86 = Release|x86 | ||
| EndGlobalSection | ||
| GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||
| __LIB_PROJECT_GUID__.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Debug|Any CPU.Build.0 = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Debug|x64.ActiveCfg = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Debug|x64.Build.0 = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Debug|x86.ActiveCfg = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Debug|x86.Build.0 = Debug|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|Any CPU.ActiveCfg = Release|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|Any CPU.Build.0 = Release|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|x64.ActiveCfg = Release|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|x64.Build.0 = Release|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|x86.ActiveCfg = Release|Any CPU | ||
| __LIB_PROJECT_GUID__.Release|x86.Build.0 = Release|Any CPU | ||
| EndGlobalSection | ||
| GlobalSection(SolutionProperties) = preSolution | ||
| HideSolutionNode = FALSE | ||
| EndGlobalSection | ||
| EndGlobal |
Uh oh!
There was an error while loading. Please reload this page.