はじめに
.NETのプロジェクトを管理するために.sln
を利用していることが多いと思いますが、.sln
は冗長で記述が多く、パス修正をしたりはたまにしますが基本手作業はかなりしづらい印象でした。
Microsoft Visual Studio Solution File, Format Version 12.00 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample", "Sample\Sample.csproj", "{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Debug|Any CPU.Build.0 = Debug|Any CPU {BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Release|Any CPU.ActiveCfg = Release|Any CPU {BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal
しかしついにMSがXMLベースに作り直した.slnx
を発表しました。 .NET SDK 9.0.200から対応しており、私が普段利用しているRiderでもRider 2024.3 EAPから対応してます。
Introducing support for SLNX, a new, simpler solution file format in the .NET CLI - .NET Blog
Support for SLNX Solution Files | The .NET Tools Blog
実際に上記の.sln
を.slnx
に変換したものを見ていただければ、その素晴らしさは一目瞭然だと思います。
<Solution> <Project Path="Sample\Sample.csproj" Type="Classic C#" /> </Solution>
個人的に.NET10から本格的に普及しだすのではないかなと思っていまして、是非今のうちに覚えておくと良い気がします。
slnからslnxへのmigrate
Rider上で行う場合
エクスプローラーウィンドウからsln
を選択し、名前をつけて保存 -> XMLソリューションとして保存(.slnx)
を実行します。

.NET CLI上で行う場合
# v9.0.200以上なことを確認する $ dotnet --version 9.0.202 $ cat ./Sample.sln Microsoft Visual Studio Solution File, Format Version 12.00 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample", "Sample\Sample.csproj", "{BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Debug|Any CPU.Build.0 = Debug|Any CPU {BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Release|Any CPU.ActiveCfg = Release|Any CPU {BC3CEB4B-17B3-41BB-9429-BA3E015E5E40}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal # slnからslnxに変換 $ dotnet sln migrate .slnx ファイル /Users/.../Sample/Sample.slnx 生成されました。 $ cat ./Sample.slnx <Solution> <Project Path="Sample/Sample.csproj" /> </Solution>
slnとslnxが複数あるときのビルド
ちなみに.sln
と.slnx
が複数存在している場合、明示的にソリューションファイルを指定してあげないとエラーになるので注意してください。
$ dotnet build MSBUILD : error MSB1011: このフォルダーは 2 つ以上のプロジェクト ファイルまたはソリューション ファイルを含んでいるため、使用するプロジェクト ファイルまたはソリューション ファイルを指定してください。 $ dotnet build ./Sample.slnx 復元が完了しました (0.2 秒) Sample 成功しました (0.1 秒) → Sample/bin/Debug/net9.0/Sample.dll 0.6 秒後に 成功しました をビルド $ rm ./Sample.sln $ dotnet build 復元が完了しました (0.2 秒) Sample 成功しました (0.1 秒) → Sample/bin/Debug/net9.0/Sample.dll 0.6 秒後に 成功しました をビルド
dotnet slnコマンド
.slnx
を利用していても、dotnet sln
コマンドでの操作が可能です。
learn.microsoft.com
$ dotnet sln list プロジェクト ------ Sample/Sample.csproj $ dotnet sln ./Sample.slnx remove ./Sample/Sample.csproj プロジェクト `Sample/Sample.csproj` がソリューションから削除されました。 $ dotnet sln ./Sample.slnx add ./Sample/Sample.csproj プロジェクト `Sample/Sample.csproj` をソリューションに追加しました。