https://github.com/winscripter/slnx
Fast & simple reader and writer for in-preview Visual Studio SLNX files
https://github.com/winscripter/slnx
csharp dotnet sln sln-files sln-parser slnx slnx-parser solution visualstudio
Last synced: about 1 month ago
JSON representation
Fast & simple reader and writer for in-preview Visual Studio SLNX files
- Host: GitHub
- URL: https://github.com/winscripter/slnx
- Owner: winscripter
- License: mit
- Created: 2024-04-23T07:31:18.000Z (about 2 years ago)
- Default Branch: main
- Last Pushed: 2024-04-28T15:00:22.000Z (about 2 years ago)
- Last Synced: 2024-04-28T16:22:28.757Z (about 2 years ago)
- Topics: csharp, dotnet, sln, sln-files, sln-parser, slnx, slnx-parser, solution, visualstudio
- Language: C#
- Homepage:
- Size: 29.3 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
> [!IMPORTANT]
> It is recommended to use an official library to work with SLNX files. See Microsoft.VisualStudio.SolutionPersistence
> on [NuGet](https://nuget.org/packages/Microsoft.VisualStudio.SolutionPersistence) or [GitHub](https://github.com/microsoft/vs-solutionpersistence).
>
# Slnx
SLNX is a fast parser and writer for the (currently) new in-preview Visual Studio XML Solution format with a .slnx extension, introduced in Visual Studio 2022 17.10 Preview 3.
Slnx has been around since April 23, 2024 - days after SLNX file format was introduced.
Available on NuGet: https://nuget.org/packages/Slnx
### Reading
```cs
using Slnx;
var model = SlnxModel.Load(File.ReadAllText("TestSlnx.txt"));
foreach (Folder folder in model.TopLevelFolders!)
{
foreach (string file in folder.DescendantFiles!)
{
Console.WriteLine(file);
}
}
```
TestSlnx.txt content:
```
```
Output:
```
File1.cs
.editorconfig
```
### Writing (applies to Slnx 3.0)
```cs
using Slnx;
using System.Text.Json;
// Note: This is a .NET 8 project and uses Collection Expressions.
var factory = new SlnxFactory();
var folder = new Folder("Solution Items");
folder.AddProjectWithPathOnly("./CSharp/CSharp.csproj");
folder.AddProjectWithPathOnly("./VB.NET/VB.NET.vbproj");
folder.AddProject(new Project("./DockerCompose/DockerCompose.dcproj", type: Guid.NewGuid().ToString(), config: new(solution: "*|*", project: "*|*|Deploy")));
var moreFolders = new Folder("C++");
moreFolders.AddFiles(["util.cpp", "util.h", "data.cc", "data.h"]);
folder.AddFiles(["File1.cs", "File2.cs"]);
folder.AddFolder(moreFolders);
factory.AddFolder(folder);
factory.AddProjectWithPathOnly("Slnx/Slnx.csproj");
factory.AddProjectWithPathOnly("App/App.shproj");
string content = factory.AsModel().Store();
File.AppendAllText("OutputSlnx.txt", content);
// To provide detailed information, I'll just JSONify it with System.Text.Json.
var model = SlnxModel.Load(File.ReadAllText("OutputSlnx.txt"));
Console.WriteLine(JsonSerializer.Serialize(model));
```
The program will generate a file named `OutputSlnx.txt` with these contents:
```
```
# Contributing
Bug reports, feature suggestions, questions, and other feedback are welcome.
# Compatibility
Slnx uses the .NET 6.0 Runtime, but it works fine for preceding versions, including .NET 7.0, 8.0, and future releases.
# Benchmarking
## Read Benchmark
Input:
```xml
```
Benchmark result:
```
BenchmarkDotNet v0.14.0, Windows 11 (10.0.22631.2861/23H2/2023Update/SunValley3)
AMD Ryzen 7 4700U with Radeon Graphics, 1 CPU, 8 logical and 8 physical cores
.NET SDK 8.0.303
[Host] : .NET 8.0.7 (8.0.724.31311), X64 RyuJIT AVX2
DefaultJob : .NET 8.0.7 (8.0.724.31311), X64 RyuJIT AVX2
```
| Method | Mean | Error | StdDev | Gen0 | Allocated |
|------------ |---------:|----------:|----------:|-------:|----------:|
| ReadBenchie | 4.486 μs | 0.0301 μs | 0.0267 μs | 7.1106 | 14.55 KB |
## Write Benchmark
Code:
```cs
var factory = new SlnxFactory();
var folder = new Folder("Solution Items");
folder.AddProjectWithPathOnly("./CSharp/CSharp.csproj");
folder.AddProjectWithPathOnly("./VB.NET/VB.NET.vbproj");
folder.AddProject(new Project("./DockerCompose/DockerCompose.dcproj", type: null, config: new(solution: "*|*", project: "*|*|Deploy")));
var moreFolders = new Folder("C++");
moreFolders.AddFiles(["util.cpp", "util.h", "data.cc", "data.h"]);
folder.AddFiles(["File1.cs", "File2.cs"]);
folder.AddFolder(moreFolders);
factory.AddFolder(folder);
factory.AddProjectWithPathOnly("Slnx/Slnx.csproj");
factory.AddProjectWithPathOnly("App/App.shproj");
_ = factory.AsModel().Store();
```
To provide the accurate benchmark, we're not saving or logging the result anywhere like console or file - we're
just focusing on how fast Slnx can export the SlnxFactory instance as a string.
Benchmark result:
```
BenchmarkDotNet v0.14.0, Windows 11 (10.0.22631.2861/23H2/2023Update/SunValley3)
AMD Ryzen 7 4700U with Radeon Graphics, 1 CPU, 8 logical and 8 physical cores
.NET SDK 8.0.303
[Host] : .NET 8.0.7 (8.0.724.31311), X64 RyuJIT AVX2
DefaultJob : .NET 8.0.7 (8.0.724.31311), X64 RyuJIT AVX2
```
| Method | Mean | Error | StdDev | Gen0 | Allocated |
|------------- |---------:|----------:|----------:|-------:|----------:|
| WriteBenchie | 4.841 μs | 0.0371 μs | 0.0310 μs | 9.4299 | 19.33 KB |