The New .slnx Solution Format (migration guide)

ุงู„ู€ Solution files ุฏุงูŠู…ุงู‹ ูƒุงู†ุช ู‡ูŠ ุงู„ู…ู„ู ุงู„ู„ูŠ ู…ููŠุด ุญุฏ ุนุงูŠุฒ ูŠู„ู…ุณู‡ ูˆู‚ุช ุงู„ู€ merge conflict. ุฃู†ุง ู„ุณู‡ ูุงูƒุฑ ุงู„ู…ุนุงู†ุงุฉ ุจุชุงุนุฉ ุญู„ ุงู„ู€ conflicts ููŠ ุงู„ู€ monorepos ุงู„ูƒุจูŠุฑุฉ ุงู„ู„ูŠ ููŠู‡ุง ู…ุฆุงุช ุงู„ู…ุดุงุฑูŠุนุŒ ูˆุจุตุฑุงุญุฉ ุงู„ู…ูˆุถูˆุน ู…ูƒู†ุด ููŠู‡ ุฃูŠ ู†ูˆุน ู…ู† ุฃู†ูˆุงุน ุงู„ู…ุชุนุฉ.

ุดุฑูƒุฉ Microsoft ุฃุฎูŠุฑุงู‹ ุจุฏุฃุช ุชุญู„ ุงู„ุฃุฒู…ุฉ ุฏูŠ ุจุชู‚ุฏูŠู… ุงู„ู€ .slnx: ูˆุฏู‡ ุนุจุงุฑุฉ ุนู† XML-based formatุŒ ุจุณูŠุทุŒ ูˆู…ุตู…ู… ุนุดุงู† ูŠูƒูˆู† ุฃุณู‡ู„ ููŠ ุงู„ู‚ุฑุงูŠุฉุŒ ุงู„ุชุนุฏูŠู„ุŒ ูˆุงู„ู€ merge. ูˆุฏู‡ ุงู„ุฏู„ูŠู„ ุงู„ุนู…ู„ูŠ ุจุชุงุนูƒ ู„ู…ุณุชู‚ุจู„ ุงู„ู€ .NET solutions.

The Problem with .sln

ู…ู„ูุงุช ุงู„ู€ .sln ุงู„ุชู‚ู„ูŠุฏูŠุฉ โ€œุฑุบุงูŠุฉโ€ ุฌุฏุงู‹ (verbose): ู…ู„ูŠุงู†ุฉ GUIDs ู„ูƒู„ ู…ุดุฑูˆุนุŒ ูˆูƒู…ุงู† ููŠู‡ุง Blocks ู„ู„ู€ configuration ุจุชูƒุจุฑ ุจุดูƒู„ ู…ุฑุนุจ ูƒู„ ู…ุง ุงู„ู€ solution ูŠูƒุจุฑ. ูˆุฏู‡ ุจูŠุฎู„ูŠู‡ุง ู…ุตุฏุฑ ุฏุงูŠู… ู„ู„ู€ merge conflicts.

ุนุดุงู† ู†ู‚ุฏุฑ ู‚ูŠู…ุฉ ุงู„ู€ format ุงู„ุฌุฏูŠุฏุŒ ู„ุงุฒู… ู†ุจุต ุจุตุฉ ุนู„ู‰ ุงู„ุดูƒู„ ุงู„ู‚ุฏูŠู…. ุฏู‡ ู…ู„ู .sln ุชู‚ู„ูŠุฏูŠ ู„ู€ solution ุญุฌู…ู‡ ู…ุชูˆุณุท:

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.7.34031.279
MinimumVisualStudioVersion = 10.0.40219.1
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8FC526EA-218B-4615-8410-4E1850611F38}"
	ProjectSection(SolutionItems) = preProject
		.editorconfig = .editorconfig
		Directory.Build.props = Directory.Build.props
		Directory.Packages.props = Directory.Packages.props
	EndProjectSection
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{64A28C1B-09AF-426E-8721-D002BE554B48}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SharedKernel", "src\SharedKernel\SharedKernel.csproj", "{166778A2-518F-47F0-BBC7-DB49C76A963C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Domain", "src\Domain\Domain.csproj", "{6448ADE8-34BC-4F2F-A68C-5B2D6BF4FB0B}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Application", "src\Application\Application.csproj", "{0F576D4A-156D-4626-A4D5-83DD0F6FAFE7}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Infrastructure", "src\Infrastructure\Infrastructure.csproj", "{C699FD09-4D82-4C4B-8744-4FD3B0D60EFC}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Web.Api", "src\Web.Api\Web.Api.csproj", "{86506D03-3746-41E7-A645-97D3633981DB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{1EB88D85-BE1E-46DE-99A2-2F02363060AF}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ArchitectureTests", "tests\ArchitectureTests\ArchitectureTests.csproj", "{8D8E2A8A-D3FE-4230-BEF7-C427D6BD87DA}"
EndProject
Project("{E53339B2-1760-4266-BCC7-CA923CBCF16C}") = "docker-compose", "docker-compose.dcproj", "{34BB3069-D5D0-4046-ACAD-A2025ED7678F}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{166778A2-518F-47F0-BBC7-DB49C76A963C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{166778A2-518F-47F0-BBC7-DB49C76A963C}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{166778A2-518F-47F0-BBC7-DB49C76A963C}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{166778A2-518F-47F0-BBC7-DB49C76A963C}.Release|Any CPU.Build.0 = Release|Any CPU
		{6448ADE8-34BC-4F2F-A68C-5B2D6BF4FB0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{6448ADE8-34BC-4F2F-A68C-5B2D6BF4FB0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{6448ADE8-34BC-4F2F-A68C-5B2D6BF4FB0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{6448ADE8-34BC-4F2F-A68C-5B2D6BF4FB0B}.Release|Any CPU.Build.0 = Release|Any CPU
		{0F576D4A-156D-4626-A4D5-83DD0F6FAFE7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{0F576D4A-156D-4626-A4D5-83DD0F6FAFE7}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{0F576D4A-156D-4626-A4D5-83DD0F6FAFE7}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{0F576D4A-156D-4626-A4D5-83DD0F6FAFE7}.Release|Any CPU.Build.0 = Release|Any CPU
		{C699FD09-4D82-4C4B-8744-4FD3B0D60EFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{C699FD09-4D82-4C4B-8744-4FD3B0D60EFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{C699FD09-4D82-4C4B-8744-4FD3B0D60EFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{C699FD09-4D82-4C4B-8744-4FD3B0D60EFC}.Release|Any CPU.Build.0 = Release|Any CPU
		{86506D03-3746-41E7-A645-97D3633981DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{86506D03-3746-41E7-A645-97D3633981DB}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{86506D03-3746-41E7-A645-97D3633981DB}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{86506D03-3746-41E7-A645-97D3633981DB}.Release|Any CPU.Build.0 = Release|Any CPU
		{8D8E2A8A-D3FE-4230-BEF7-C427D6BD87DA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{8D8E2A8A-D3FE-4230-BEF7-C427D6BD87DA}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{8D8E2A8A-D3FE-4230-BEF7-C427D6BD87DA}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{8D8E2A8A-D3FE-4230-BEF7-C427D6BD87DA}.Release|Any CPU.Build.0 = Release|Any CPU
		{34BB3069-D5D0-4046-ACAD-A2025ED7678F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{34BB3069-D5D0-4046-ACAD-A2025ED7678F}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{34BB3069-D5D0-4046-ACAD-A2025ED7678F}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{34BB3069-D5D0-4046-ACAD-A2025ED7678F}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(NestedProjects) = preSolution
		{166778A2-518F-47F0-BBC7-DB49C76A963C} = {64A28C1B-09AF-426E-8721-D002BE554B48}
		{6448ADE8-34BC-4F2F-A68C-5B2D6BF4FB0B} = {64A28C1B-09AF-426E-8721-D002BE554B48}
		{0F576D4A-156D-4626-A4D5-83DD0F6FAFE7} = {64A28C1B-09AF-426E-8721-D002BE554B48}
		{C699FD09-4D82-4C4B-8744-4FD3B0D60EFC} = {64A28C1B-09AF-426E-8721-D002BE554B48}
		{86506D03-3746-41E7-A645-97D3633981DB} = {64A28C1B-09AF-426E-8721-D002BE554B48}
		{8D8E2A8A-D3FE-4230-BEF7-C427D6BD87DA} = {1EB88D85-BE1E-46DE-99A2-2F02363060AF}
	EndGlobalSection
	GlobalSection(ExtensibilityGlobals) = postSolution
		SolutionGuid = {B948A3CC-9872-4612-ABD2-BB3D49671542}
	EndGlobalSection
EndGlobal

ุญุธ ุณุนูŠุฏ ุจู‚ู‰ ูˆุฃู†ุช ุจุชุญุงูˆู„ ุชูู‡ู… ุฃูŠ ุญุงุฌุฉ ู…ู† ุงู„ูƒู„ุงู… ุฏู‡ ูˆุฃู†ุช ุจุชุญู„ merge conflict!

What .slnx looks like

ุงู„ู€ .slnx ุงู„ุจุณูŠุท ู‡ูˆ ุฃุณุงุณุงู‹ ุนุจุงุฑุฉ ุนู† ู„ุณุชุฉ ู…ุดุงุฑูŠุน ู…ูƒุชูˆุจุฉ ุจู€ XML.

ุฏู‡ ู†ูุณ ุงู„ู€ solution ุงู„ู„ูŠ ููˆู‚ ุจุงู„ุธุจุทุŒ ุจุณ ุจู€ format ุงู„ู€ .slnx. ู‡ุชู„ุงุญุธ ุฅู†ู†ุง ู„ุณู‡ ุนู†ุฏู†ุง ุงู„ู€ solution itemsุŒ ุงู„ู€ foldersุŒ ูˆุญุชู‰ ุงู„ู€ docker-compose project:

<Solution>
  <Folder Name="/Solution Items/">
    <File Path=".editorconfig" />
    <File Path="Directory.Build.props" />
    <File Path="Directory.Packages.props" />
  </Folder>
  <Folder Name="/src/">
    <Project Path="src/Application/Application.csproj" />
    <Project Path="src/Domain/Domain.csproj" />
    <Project Path="src/Infrastructure/Infrastructure.csproj" />
    <Project Path="src/SharedKernel/SharedKernel.csproj" />
    <Project Path="src/Web.Api/Web.Api.csproj" />
  </Folder>
  <Folder Name="/tests/">
    <Project Path="tests/ArchitectureTests/ArchitectureTests.csproj" />
  </Folder>
  <Project Path="docker-compose.dcproj">
    <Build />
  </Project>
</Solution>

ุงู„ุดูƒู„ ุฏู‡ ุดุจู‡ ุงู„ู€ .csproj file ุฌุฏุงู‹.

How to Migrate Today

ุงู„ู€ format ุงู„ุฌุฏูŠุฏ .slnx ู…ุชุงุญ ุญุงู„ูŠุงู‹ ููŠ ุงู„ุฅุตุฏุงุฑุงุช ุงู„ุฃุฎูŠุฑุฉ ู…ู† ุงู„ู€ Visual Studio 2022 (v17.13+) ูˆุงู„ู€ .NET 9 SDK. ูˆุฏูŠ ุงู„ุทุฑูŠู‚ุฉ ุงู„ู„ูŠ ุชู‚ุฏุฑ ุชุญูˆู„ ุจูŠู‡ุง:

Option 1: The Command Line

ู„ูˆ ุนู†ุฏูƒ ุงู„ู€ .NET 9 SDK ู…ุชุณุทุจ (ุชุญุฏูŠุฏุงู‹ ุฅุตุฏุงุฑ 9.0.200 ุฃูˆ ุฃุญุฏุซ)ุŒ ุชู‚ุฏุฑ ุชุญูˆู„ ููˆุฑุงู‹ ุนู† ุทุฑูŠู‚ ุงู„ู€ CLI:

  1. ุงูุชุญ ุงู„ู€ terminal ููŠ ุงู„ููˆู„ุฏุฑ ุจุชุงุน ุงู„ู€ solution.
  2. ุดุบู„ ุฃู…ุฑ ุงู„ุชุญูˆูŠู„:
dotnet sln migrate

ุฏู‡ ู‡ูŠุนู…ู„ ู…ู„ู .slnx ุฌุฏูŠุฏ ุฌู†ุจ ู…ู„ู ุงู„ู€ .sln ุงู„ู‚ุฏูŠู… ุจุชุงุนูƒ. ููŠ ุงู„ู…ุฑุญู„ุฉ ุฏูŠุŒ ุฃู†ุตุญูƒ ุชู…ุณุญ ู…ู„ู ุงู„ู€ .sln ุงู„ู‚ุฏูŠู… ุนุดุงู† ู…ุชุชู„ุฎุจุทุดุŒ ู…ููŠุด ูุงูŠุฏุฉ ุฅู†ูƒ ุชุณูŠุจ ุงู„ุงุชู†ูŠู† ููŠ ู†ูุณ ุงู„ู€ repo.

Option 2: Visual Studio โ€œSave Asโ€

ู„ูˆ ุจุชูุถู„ ุชุณุชุฎุฏู… ุงู„ู€ GUIุŒ ุชู‚ุฏุฑ ุชุนู…ู„ ุฏู‡ ู…ู† ุฌูˆู‡ Visual Studio 2022 (ุฃูˆ 2026):

  1. ุงุฎุชุงุฑ ุงู„ู€ Solution ู…ู† ุงู„ู€ Solution Explorer.
  2. ุฑูˆุญ ู„ู€ File > Save Solution Asโ€ฆ
  3. ุบูŠุฑ ุงู„ู€ dropdown ุจุชุงุน โ€œSave as typeโ€ ู„ู€ Xml Solution File (*.slnx).

Why You Should Care

  1. ุงู„ู€ Fewer Merge Conflicts: ุฏูŠ ุงู„ู…ูŠุฒุฉ ุฑู‚ู… 1. ุนุดุงู† ุงู„ู…ู„ู ุนุจุงุฑุฉ ุนู† XML ุจุณูŠุท ูˆู…ู† ุบูŠุฑ GUIDs ุนุดูˆุงุฆูŠุฉ ุจุชุชุบูŠุฑ ูƒู„ ุดูˆูŠุฉุŒ ุงู„ู€ git merges ุจุชุจู‚ู‰ ุชุงูู‡ุฉ.
  2. ุงู„ู€ Human Readable: ุชู‚ุฏุฑ ุชูุชุญ ุงู„ู…ู„ู ุฏู‡ ููŠ Notepad ูˆุชูู‡ู…ู‡ ูˆุชุนุฏู„ ููŠู‡ ู…ู† ุบูŠุฑ ู…ุง ุชุจูˆุธ ุงู„ู€ build ุจุชุงุนูƒ ูƒู„ู‡.
  3. ุงู„ู€ Consistency: ุฃุฎูŠุฑุงู‹ ุจู‚ู‰ ุดูƒู„ ุงู„ู€ solution ู…ุชู…ุงุดูŠ ู…ุน ุดูƒู„ ุงู„ู€ project (.csproj)ุŒ ุงู„ู„ูŠ ุงุชุญูˆู„ ู„ู€ XML ู…ุจุณุท ู…ู† ุณู†ูŠู†.
  4. ุงู„ู€ Performance: ุญุฌู… ู…ู„ูุงุช ุฃุตุบุฑ ูˆ parsing ุฃุณู‡ู„ุŒ ูˆุฏู‡ ู…ุนู†ุงู‡ ุณุฑุนุฉ ุชุญู…ูŠู„ (load times) ุฃุญุณู† ุดูˆูŠุฉ ููŠ ุงู„ู€ solutions ุงู„ุนู…ู„ุงู‚ุฉ.

Visual Comparison

graph TD
    subgraph "Old Format (.sln)"
    A[GUID-based Header] --> B[Complex Project Sections]
    B --> C[Manual GUID Mapping]
    C --> D[Massive Configuration Blocks]
    end

    subgraph "New Format (.slnx)"
    E[Simple XML Tag] --> F[Folder Elements]
    F --> G[Project Paths]
    G --> H[Human Readable Structure]
    end

Is it Ready?

ููŠ ุฃูˆุงุฎุฑ 2025 ูˆุจุฏุงูŠุฉ 2026ุŒ ุงู„ู€ .slnx ู„ุณู‡ ูŠุนุชุจุฑ Preview feature ุชู‚ู†ูŠุงู‹.

  • ู‡ู„ ุขู…ู† ู„ู„ุงุณุชุฎุฏุงู…ุŸ ุฃูŠูˆู‡ุŒ ุงู„ู€ format ู†ูุณู‡ ู…ุณุชู‚ุฑ.
  • ุฏุนู… ุงู„ุฃุฏูˆุงุชุŸ ุงู„ู€ Visual Studio 2022 ูˆ Visual Studio 2026 ูˆ Rider ุจูŠุฏุนู…ูˆู‡ ูƒูˆูŠุณ ุฌุฏุงู‹ุŒ ูˆูƒุฐู„ูƒ ุงู„ู€ .NET CLI. ู…ู…ูƒู† ุจุนุถ ุงู„ู€ pipelines ุงู„ู‚ุฏูŠู…ุฉ (CI/CD) ุฃูˆ ุฃุฏูˆุงุช ุงู„ู€ 3rd party ู…ุชุชุนุฑูุด ุนู„ู‰ ุงู„ุงู…ุชุฏุงุฏ ุฏู‡ ู„ุณู‡.

ู†ุตูŠุญุชูŠ: ุฌุฑุจู‡ ุงู„ุฃูˆู„ ุนู„ู‰ side project ุฃูˆ branch ู„ูˆุญุฏู‡. ู„ูˆ ุงู„ู€ CI pipeline ุจุชุงุนุชูƒ ุชู…ุงู…ุŒ ูŠุจู‚ู‰ ุฃู†ุช ุฌุงู‡ุฒ ู„ู„ุชุญุฏูŠุซ. ุฃู†ุง ุดุฎุตูŠุงู‹ ุจุณุชุฎุฏู… ุงู„ู€ format ุฏู‡ ููŠ ูƒู„ ู…ุดุงุฑูŠุนูŠ ุงู„ุฌุฏูŠุฏุฉ ูˆุญูˆู„ุช ูƒุฐุง ู…ุดุฑูˆุน ู…ูˆุฌูˆุฏ ูุนู„ุงู‹ ูˆู…ูˆุงุฌู‡ุชุด ุฃูŠ ู…ุดุงูƒู„.


Notes

  • ู†ู‚ุทุฉ ุงู„ู€ GUIDs ููŠ ุงู„ู€ .sln ุงู„ู‚ุฏูŠู… ูƒุงู†ุช ุถุฑูˆุฑูŠุฉ ู„ู€ Visual Studio ุนุดุงู† ูŠุฑุจุท ุงู„ู…ุดุงุฑูŠุน ุจุจุนุถู‡ุงุŒ ู„ูƒู† ููŠ ุงู„ู€ .slnx ุงู„ู€ IDE ุจูŠู‚ุฏุฑ ูŠุชุนุงู…ู„ ู…ุน ุงู„ู€ paths ุจุดูƒู„ ุฃุฐูƒู‰ ูˆูŠูˆู„ุฏ ุงู„ู€ IDs ุฏูŠ ููŠ ุงู„ู€ memory ูˆู‚ุช ุงู„ู€ runtime ุจุฏู„ ู…ุง ูŠุฎุฒู†ู‡ุง ููŠ ุงู„ู…ู„ู.
  • ุดุฑูƒุฉ Microsoft ุจุชุฎุทุท ุฅู† ุงู„ู€ .slnx ูŠูƒูˆู† ู‡ูˆ ุงู„ู€ default format ู„ู…ุง ุชูŠุฌูŠ ุชุนู…ู„ dotnet new sln ููŠ ุงู„ู…ุณุชู‚ุจู„ ุงู„ู‚ุฑูŠุจุŒ ูˆุฏู‡ ู‡ูŠุฎู„ูŠ ุงู„ุงุนุชู…ุงุฏ ุนู„ูŠู‡ ู…ุด ู…ุฌุฑุฏ ุงุฎุชูŠุงุฑ ุจู„ ู‡ูˆ ุงู„ู€ standard ุงู„ุฌุฏูŠุฏ. ูƒู…ุงู† ุงู„ู€ .NET 10 SDK ุจูŠู‚ุฏู… ุชุญุณูŠู†ุงุช ููŠ ุณุฑุนุฉ ุงู„ู€ discovery ู„ู„ู…ุดุงุฑูŠุน ุฌูˆู‡ ุงู„ู€ .slnx.