Au revoir fichier SLN, bonjour fichier SLNX !
Publié le 11/04/2024
Par  Christophe MOMMER

Avec la preview 3 de Visual Studio 2022 17.10, Microsoft a discrètement ajouté la fonctionnalité permettant d’utiliser un nouveau format de solution.

Mais, qu’est ce qui cloche avec l’existant ? Avez-vous déjà essayé d’ouvrir un fichier SLN avec un éditeur de texte ? Voici ce qu’on voit : 

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.0.31903.59
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AppConsole", "AppConsole\AppConsole.csproj", "{2B7E049B-9C39-4C7D-BE0F-4F97E9F64821}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApi", "WebApi\WebApi.csproj", "{ED47FC09-A0DB-45A9-8DA8-A505B3B35EDE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Library", "Library\Library.csproj", "{28ED12BA-660C-49BC-B5EC-5600E12B1138}"
EndProject
Global
	GlobalSection(SolutionConfigurationPlatforms) = preSolution
		Debug|Any CPU = Debug|Any CPU
		Release|Any CPU = Release|Any CPU
	EndGlobalSection
	GlobalSection(SolutionProperties) = preSolution
		HideSolutionNode = FALSE
	EndGlobalSection
	GlobalSection(ProjectConfigurationPlatforms) = postSolution
		{2B7E049B-9C39-4C7D-BE0F-4F97E9F64821}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{2B7E049B-9C39-4C7D-BE0F-4F97E9F64821}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{2B7E049B-9C39-4C7D-BE0F-4F97E9F64821}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{2B7E049B-9C39-4C7D-BE0F-4F97E9F64821}.Release|Any CPU.Build.0 = Release|Any CPU
		{ED47FC09-A0DB-45A9-8DA8-A505B3B35EDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{ED47FC09-A0DB-45A9-8DA8-A505B3B35EDE}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{ED47FC09-A0DB-45A9-8DA8-A505B3B35EDE}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{ED47FC09-A0DB-45A9-8DA8-A505B3B35EDE}.Release|Any CPU.Build.0 = Release|Any CPU
		{28ED12BA-660C-49BC-B5EC-5600E12B1138}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
		{28ED12BA-660C-49BC-B5EC-5600E12B1138}.Debug|Any CPU.Build.0 = Debug|Any CPU
		{28ED12BA-660C-49BC-B5EC-5600E12B1138}.Release|Any CPU.ActiveCfg = Release|Any CPU
		{28ED12BA-660C-49BC-B5EC-5600E12B1138}.Release|Any CPU.Build.0 = Release|Any CPU
	EndGlobalSection
EndGlobal

D’une part, ça ne respecte aucun format actuellement en vigueur, mais en plus, c’est assez compliqué à lire et à modifier par un humain si nécessaire. Et que dire des problèmes de merge qui peuvent arriver ici ou là…

Ce temps est-il derrière nous ? Pas tout de suite, mais c’est en bonne voie !

On a droit à un nouveau format, le SLNX, qui, à l’instar du csproj, se base sur un format XML facile à lire, modifier, éditer et fusionner dans GIT. De surcroît, beaucoup d’informations inutiles ont disparues. Comparativement, voici le contenu :

<Solution>
  <Project Path="AppConsole\AppConsole.csproj" />
  <Project Path="Library\Library.csproj" />
  <Project Path="WebApi\WebApi.csproj" />
</Solution>

Plus propre non ? On peut aussi se laisser porter par l’espoir que la lecture XML, implémentée depuis des années dans le framework .NET, permettra de lire plus rapidement ce type de fichier, permettant aux solutions de charger plus rapidement et d’être plus efficace en cas de changement de branches Git lorsque des projets sont ajoutés et/ou retirer. Et peut-être est-ce aussi la porte ouverte à un refactoring profond dans Visual Studio qui permettrait de renommer un projet et d’avoir automatiquement tous les fichiers, namespaces et dossiers qui sont modifiés ? Bon, on peut un peu rêver quand même.

Cependant, ce format n’est pas par défaut dans VS 2022 (et vu que c’est un upgrade majeur avec un changement cassant, je doute que ça le soit un jour, peut être dans la prochaine version majeure de VS). Il faut l’activer manuellement, dans les options :

Une fois ceci fait, on peut faire un enregistrement avec « Enregistrer sous » et choisir le nouveau format :

 

Pour le moment, le lien entre un fichier .slnx et Visual Studio 2022 n’a pas été fait automatiquement, il faudra donc passer par Windows pour faire l’association. De même, ni Rider ni VS Code avec C# Dev Kit ne supportent ce nouveau format, car il n’est pas encore standard. Mais le travail a commencé, et j’ai hâte de pouvoir utiliser ce nouveau format de façon permanente !