slnutil 3.0.1

dotnet tool install --global slnutil --version 3.0.1
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local slnutil --version 3.0.1
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=slnutil&version=3.0.1
                    
nuke :add-package slnutil --version 3.0.1
                    

slnutil

A collection of utilities for working with .NET Solutions and Projects (.sln and .slnx).

NuGet NuGet Downloads License: MIT

Written by Benjamin Day
Pluralsight Author | Microsoft MVP https://www.benday.com
https://www.honestcheetah.com
info@benday.com
YouTube: https://www.youtube.com/@_benday

Key features

  • Create solutions and projects with unit tests & integration tests for...
  • Create class diagrams for all or part of a project using Mermaid
  • Update the .NET Framework version for all projects in a solution
  • Set or increment the assembly version for a project
  • Set a project property value in a csproj file
  • Deploy Entity Framework Core Migrations from a DLL (aka. deploy migrations without the source code)
  • Validate a connection string against SQL Server to make sure it connects
  • Bulk rename files and folders
  • Edit json from the command line
  • Set the connection string in appsettings.json from the command line
  • Generate C# classes from JSON
  • Run SQL commands or script files against SQL Server
  • Check and update versions in Bicep files
  • Format XML files (single file or recursive)
  • View assembly information
  • And lots more...

Suggestions, Problems, or Bugs?

Got ideas for utilities you'd like to see? Found a bug? Let us know by submitting an issue https://github.com/benday-inc/slnutil/issues. Want to contribute? Submit a pull request.

Installing

The slnutil is distributed as a .NET Core Tool via NuGet. To install it go to the command prompt and type
dotnet tool install slnutil -g

Command line syntax

Arguments are typed in the POSIX long option form that git, docker and the dotnet CLI use:

slnutil setprojectproperty --propertyname Nullable --propertyvalue enable
slnutil setprojectproperty --propertyname=Nullable --propertyvalue=enable
slnutil formatxml --filename app.config --write

A boolean argument is a flag and takes no value. The older /name:value form still works but is deprecated -- it prints a warning on stderr and will be removed in a future version.

Run slnutil for the command list, slnutil <command> --help for a command's arguments, or slnutil tui for a terminal interface that lets you browse the commands, fill in a form, and run it.

A command that fails exits with a non-zero exit code, so slnutil can be used in a script or a build pipeline step.

Commands

Command Name Description
assemblyinfo View assembly info for a DLL.
rename Bulk rename for files and folders.
classdiagram Generate a class diagram for an assembly.
cleanreferences Simplifies package references in a C# project file. Mostly this fixes stuff in the EF Core references that breaks Azure DevOps & GitHub builds like PrivateAssets and IncludeAssets directives.
createsolution Create a solution and projects
deployefmigrations Deploy EF Core Migrations from DLL binaries.
devtreeclean Clean development folder tree. Removes node_modules, .git, bin, obj, and TestResults folders.
enablecodeanalysis Enable Roslyn code analysis across a solution. Default mode creates/merges Directory.Build.props at the solution root. Use --per-project to install analyzers directly into each csproj (required for packages.config projects).
findsolutions Find solution files (sln and slnx) in a folder tree and optionally list projects with reference analysis.
formatjson Formats JSON files
formatxml Formats XML files
getconnectionstring Get database connection string in appsettings.json.
classesfromjson Create C# classes from JSON with serialization attributes for System.Text.Json.
listpackages-oldstyle Lists packages referenced in legacy style packages.config files.
listsolutionprojects Gets list of projects in a solution.
printfile Reads a text file and prints it to the console character by character. This is helpful for diagnosing encoding issues and weird text issues.
replacetoken Replace token in file.
runsql Execute SQL command or SQL script file against a database.
setconnectionstring Set database connection string in appsettings.json.
setframework Set the target framework version on all projects.
setjsonvalue Set a string value in a json file.
setpackageversion Changes NuGet package references in a C# project file to a new value.
setprojectproperty Set a project property value on all projects.
setprojectversion Set the assembly and nuget package version property value on a project.
sortpropertygroup Sorts the elements in a property group for a csproj file.
sortreferences Sorts the references in an item group for a csproj file.
base64 Encodes a string value as a base 64 string.
touch Modifies a file's date to current date time or creates a new empty file if it doesn't exist.
updatebicepversions Reads bicep file or files and updates the api versions to latest.
updategithubactionsversions Reads a GitHub Actions YAML file and updates the action versions to latest.
validateconnectionstring Validate that specified connection string can connect to SQL Server.
wildcardreference Changes package references in a C# project file to use wildcard version rather than fixed version number.
snippetize Reads a block of text from the clipboard and formats it for use in a VSCode snippet.

assemblyinfo

View assembly info for a DLL.

Arguments

Argument Is Optional Data Type Description
filename Required String Assembly to view

rename

Bulk rename for files and folders.

Arguments

Argument Is Optional Data Type Description
rootdir Optional String Starting directory for the rename operation
from Required String String to search for and replace
to Required String Replacement value
prefix Optional String Prefix all matching values with this value
preview Optional Boolean Preview changes
recursive Optional Boolean Recurse the directory tree

classdiagram

Generate a class diagram for an assembly.

Arguments

Argument Is Optional Data Type Description
namespace Optional String Filter by namespace
filename Required String Path to assembly that you want a class diagram for.
hideinheritance Optional Boolean Hide inheritance relationships.
typenamesmatchexact Optional Boolean Exact match for type names. Default is contains.
localonly Optional Boolean Only show methods and properties that are declared locally. Don't show inherited members.
typenames Optional String Show types that exist in this comma separated list. Default search is contains match that matches by substring.

cleanreferences

Simplifies package references in a C# project file. Mostly this fixes stuff in the EF Core references that breaks Azure DevOps & GitHub builds like PrivateAssets and IncludeAssets directives.

Arguments

Argument Is Optional Data Type Description
solutionpath Optional String Solution file to use
preview Optional Boolean Preview changes only

createsolution

Create a solution and projects

Arguments

Argument Is Optional Data Type Description
rootdir Optional String Starting directory. If not supplied, the tool uses the current directory.
type Required String Type of solution to create. Valid values are: webapi, mvc, console, commands, maui, maui-demo
namespace Required String This is the root namespace for the solution. For example: Benday.SampleApp
verbose Optional Boolean verbose

deployefmigrations

Deploy EF Core Migrations from DLL binaries.

Arguments

Argument Is Optional Data Type Description
binariesdir Optional String Path to EF Core migration binaries. Defaults to current directory.
startupdll Optional String Path to EF Core startup DLL.
migrationsdll Optional String Path to EF Core migrations DLL.
dbcontextname Optional String Name of the EF Core DbContext class.
namespace Optional String Root namespace of the EF Core migrations DLL.
verbose Optional Boolean Output results as comma-separated values

devtreeclean

Clean development folder tree. Removes node_modules, .git, bin, obj, and TestResults folders.

Arguments

Argument Is Optional Data Type Description
rootdir Optional String Starting directory. If not supplied, the tool uses the current directory.
keepgit Optional Boolean If true, skips delete of .git folders and preserves any git repositories. Default value is true. Set this value to false to delete .git folders.
keepnodemodules Optional Boolean If true, skips delete of node_modules folders. Default value is false.

enablecodeanalysis

Enable Roslyn code analysis across a solution. Default mode creates/merges Directory.Build.props at the solution root. Use --per-project to install analyzers directly into each csproj (required for packages.config projects).

Arguments

Argument Is Optional Data Type Description
solutionpath Optional String Solution to update. If omitted, searches the current directory for a .sln or .slnx file.
analysis-level Optional String Value for the AnalysisLevel MSBuild property. Default 'latest-Recommended' surfaces meaningful diagnostics out-of-the-box. Use 'latest-Minimum' to start very quiet, or 'latest-All' / 'latest' for maximum coverage.
analyzer-version Optional String Version of Microsoft.CodeAnalysis.NetAnalyzers to reference for .NET Framework projects. If omitted, queries nuget.org for the latest stable version.
codestyle-version Optional String Version of Microsoft.CodeAnalysis.CSharp.CodeStyle to reference for .NET Framework projects (when --enforce-code-style is enabled). If omitted, queries nuget.org for the latest stable version.
enforce-code-style Optional Boolean Enable code style enforcement (IDE* rules) during build. For .NET 5+ sets EnforceCodeStyleInBuild=true. For .NET Framework installs Microsoft.CodeAnalysis.CSharp.CodeStyle. Default: true.
dry-run Optional Boolean Preview what would change without writing any files.
create-editorconfig Optional Boolean Also create a starter .editorconfig at the solution root if one doesn't already exist.
per-project Optional Boolean Install analyzers into each project individually (modifies csproj + packages.config) instead of using Directory.Build.props. Required for solutions where projects use packages.config.
lang-version Optional String If set, writes <LangVersion> to each project (e.g. '9.0', 'latest'). Unblocks IDE rules whose remedy needs newer C# syntax (e.g. IDE0062 needs C# 8+). Leave unset to keep the compiler default.
keep-existing-rulesets Optional Boolean By default this command removes any <CodeAnalysisRuleSet> elements from each csproj because they typically silence Roslyn analyzers (e.g. the VS-scaffolded MinimumRecommendedRules.ruleset). Pass this flag to leave them in place.

findsolutions

Find solution files (sln and slnx) in a folder tree and optionally list projects with reference analysis.

Arguments

Argument Is Optional Data Type Description
rootdir Optional String Path to start search from. Defaults to current directory.
listprojects Optional Boolean List projects in solutions
csv Optional Boolean Output results as comma-separated values
json Optional Boolean Output results as JSON
skipreferences Optional Boolean Skip checking project references when listing projects in solutions

formatjson

Formats JSON files

Arguments

Argument Is Optional Data Type Description
filename Optional String Path to file or wildcard to files
recursive Optional Boolean Apply to matching files recursively
write Optional Boolean Write changes back to the file

formatxml

Formats XML files

Arguments

Argument Is Optional Data Type Description
filename Optional String Path to file or wildcard to files
recursive Optional Boolean Apply to matching files recursively
write Optional Boolean Write changes back to the file

getconnectionstring

Get database connection string in appsettings.json.

Arguments

Argument Is Optional Data Type Description
filename Optional String Path to json config file
name Required String Name of the connection string to get

classesfromjson

Create C# classes from JSON with serialization attributes for System.Text.Json.

Arguments

Argument Is Optional Data Type Description
filename Optional String Optional: file source for the JSON to convert to C# classes.
clipboard Optional Boolean Optional: read JSON from clipboard instead of a file or console input.
innerclasses Optional Boolean Optional: generate inner classes for nested JSON objects.

listpackages-oldstyle

Lists packages referenced in legacy style packages.config files.

Arguments

Argument Is Optional Data Type Description
rootdir Optional String Path to start search from

listsolutionprojects

Gets list of projects in a solution.

Arguments

Argument Is Optional Data Type Description
solutionpath Optional String Solution to examine. If this value is not supplied, the tool searches for a sln file automatically.
pathonly Optional Boolean Only show the project paths. Don't show the framework versions.

printfile

Reads a text file and prints it to the console character by character. This is helpful for diagnosing encoding issues and weird text issues.

Arguments

Argument Is Optional Data Type Description
input Required String Path to the text file to read and print.

replacetoken

Replace token in file.

Arguments

Argument Is Optional Data Type Description
filename Required String Path to file
token Required String Token to replace
value Required String String value to set

runsql

Execute SQL command or SQL script file against a database.

Arguments

Argument Is Optional Data Type Description
connectionstring Required String Connection string to the database
query Optional String SQL query to execute
sqlfile Optional String Path to SQL file to execute
display Optional Boolean Display results of query (for SELECT statements)

setconnectionstring

Set database connection string in appsettings.json.

Arguments

Argument Is Optional Data Type Description
filename Optional String Path to json config file
name Required String Name of the connection string to set
value Required String Connection string value

setframework

Set the target framework version on all projects.

Arguments

Argument Is Optional Data Type Description
solutionpath Optional String Solution to examine. If this value is not supplied, the tool searches for a sln file automatically.
version Required String Framework version to set projects to.

setjsonvalue

Set a string value in a json file.

Arguments

Argument Is Optional Data Type Description
filename Optional String Path to json config file
level1 Required String First level json property name to set
level2 Optional String Second level json property name to set
level3 Optional String Third level json property name to set
level4 Optional String Fourth level json property name to set
value Optional String String value to set
increment-int Optional Boolean Increment the existing value or use the '/value' as the value if it does not exist or isn't an integer.
increment-minor-version Optional Boolean Increment the minor version of the existing value or use the '/value' as the value if it does not exist or isn't an integer.
increment-patch-version Optional Boolean Increment the patch version of the existing value or use the '/value' as the value if it does not exist or isn't an integer.
bool Optional Boolean Set value into the json as boolean

setpackageversion

Changes NuGet package references in a C# project file to a new value.

Arguments

Argument Is Optional Data Type Description
solutionpath Optional String Solution file to use
preview Optional Boolean Preview changes only
filter Optional String Filter package by name. If package name starts with this value, it gets updated.
version Required String Package version to reference

setprojectproperty

Set a project property value on all projects.

Arguments

Argument Is Optional Data Type Description
solutionpath Optional String Solution to examine. If this value is not supplied, the tool searches for a sln file automatically.
propertyname Required String Name of the property to set.
propertyvalue Required String Value for the property.

setprojectversion

Set the assembly and nuget package version property value on a project.

Arguments

Argument Is Optional Data Type Description
solutionpath Optional String Solution to examine. If this value is not supplied, the tool searches for a sln file automatically.
project Required String Project name to update.
increment Optional Boolean Increment the minor value.
value Optional String Value for the property.

sortpropertygroup

Sorts the elements in a property group for a csproj file.

Arguments

Argument Is Optional Data Type Description
project Optional String Project file to edit. If this value is not supplied, the tool looks for a csproj file in the current directory.

sortreferences

Sorts the references in an item group for a csproj file.

Arguments

Argument Is Optional Data Type Description
project Optional String Project file to edit. If this value is not supplied, the tool looks for a csproj file in the current directory.

base64

Encodes a string value as a base 64 string.

Arguments

Argument Is Optional Data Type Description
value Required String Value to encode as base64

touch

Modifies a file's date to current date time or creates a new empty file if it doesn't exist.

Arguments

Argument Is Optional Data Type Description
filename Required String Path to file

updatebicepversions

Reads bicep file or files and updates the api versions to latest.

Arguments

Argument Is Optional Data Type Description
filename Optional String Name of the bicep file, if you want to update just one file.
previewversions Optional Boolean Allow preview versions for resources.
preview Optional Boolean Do not save changes only preview the changes.

updategithubactionsversions

Reads a GitHub Actions YAML file and updates the action versions to latest.

Arguments

Argument Is Optional Data Type Description
filename Optional String Name of the GitHub Actions YAML file to update.

validateconnectionstring

Validate that specified connection string can connect to SQL Server.

Arguments

Argument Is Optional Data Type Description
filename Optional String Path to json config file
name Required String Name of the connection string to validate

wildcardreference

Changes package references in a C# project file to use wildcard version rather than fixed version number.

Arguments

Argument Is Optional Data Type Description
solutionpath Optional String Solution file to use
preview Optional Boolean Preview changes only
filter Required String Filter package by name. If package name starts with this value, it gets updated.

snippetize

Reads a block of text from the clipboard and formats it for use in a VSCode snippet.

Arguments

Argument Is Optional Data Type Description
Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
3.0.1 37 9/9/2026
3.0.0 46 9/8/2026
2.41.1 139 8/15/2026
2.41.0 129 7/17/2026
2.40.0 157 5/19/2026
2.38.0 146 5/18/2026
2.37.0 182 4/10/2026
2.35.1 207 3/5/2026
2.35.0 158 3/4/2026
2.33.0 199 1/20/2026
2.32.1 363 12/17/2025
2.32.0 343 12/17/2025
2.31.0 287 11/4/2025
2.30.0 288 11/3/2025
2.29.0 300 10/2/2025
2.28.0 360 9/4/2025
2.27.0 277 9/4/2025
2.26.0 623 7/21/2025
2.25.0 484 6/11/2025
2.24.0 345 5/16/2025
Loading failed

v3.0.1 - findsolutions: fixed the --json option. The command handed the analysis objects to the serializer directly and those hold FileInfo and DirectoryInfo values. DirectoryInfo exposes Parent and Root as more DirectoryInfo instances and a root directory is its own Root, so the serializer walked that chain until it reported an object cycle. Every property it touched on the way was a filesystem call, which is why it ran for a long time before failing. Results are now projected onto plain classes that hold paths as strings; findsolutions: --json is no longer ignored when --listprojects is not supplied; findsolutions: fixed the table output for a project that has no references. The row was built with the twelve CSV columns no matter which format was being written, so the table formatter rejected it with "Expected 5 columns but received 12 columns". With --skipreferences this affected every project, so that combination could never run;
v3.0 - BREAKING. Upgraded to Benday.CommandsFramework v5. slnutil now returns a real exit code: a failed command exits 1 rather than the 0 that every run reported before, so a script or pipeline step that runs slnutil will start seeing failures it previously ignored; Arguments are now typed in the POSIX long option form -- '--name value', '--name=value', '--name:value' and '--flag' -- which is what usage output, shell completion and validation messages render. The original '/name:value' form still parses and prints a deprecation warning on stderr; Unknown arguments are now a validation failure rather than being ignored, so a misspelled argument name stops the command instead of silently going missing; Added the 'tui' terminal interface -- run 'slnutil tui' to browse the commands, fill in a form, copy the command line it adds up to, and run it; runsql now enforces 'exactly one of sqlcommand or sqlfile' as a declared argument rule, so the requirement appears in usage output and in the --json schema; The --json schema is now an object with SchemaVersion rather than a bare array of commands; createsolution's 'commands' template now generates a v5 tool;
v2.41.1 - findsolutions: fixed cross-solution reference detection. Relative paths written with backslashes were not resolved when running on macOS or Linux, and containment was compared without a directory boundary so a sibling folder sharing a name prefix read as being inside its neighbour. Both made outside-of-solution-root report false when it should have reported true;
v2.41 - Refactored FindSolutions command to default to table formatted output when list projects is requested;
v2.40 - enablecodeanalysis: also installs Microsoft.CodeAnalysis.CSharp.CodeStyle for IDE rule enforcement (default on; opt out with /enforce-code-style:false); added /codestyle-version to pin the package version;
v2.39 - findsolutions: added target-framework and uses-packages-config columns plus finer-grained reference-type classification (framework-ref, nuget-via-packages-config, fixed PackageReference detection); Added enablecodeanalysis command to streamline VS2026 code
  analysis across a solution, with a per-project mode for packages.config solutions;
v2.38 - Fixing bugs in findsolutions command; Updating createsolution to create modern xunit projects;
v2.37 - Added updategithubactionsversions command to update GitHub Actions versions in workflow files;
v2.36 - Added formatjson command to format JSON files;
v2.35 - Added 'gui' support to launch a blazor UI for this command; Updated dependencies and minor bug fixes;
v2.34 - Modified find solutions command to also find .slnx files;
v2.33 - Modified SetJsonValueCommand to allow incrementing patch version numbers;
v2.32.1 - Updated dependencies to fix security vulnerabilities;
v2.32 - Added support for .net10; Added support for slnx files; Modified create solution command to no longer install FluentAssertions library;
v2.31 - Modified classes from json command to 1) detect DateTime property values 2) optionally generate inner classes instead of separate classes;
v2.30 - Added clipboard option to classes from json command to read JSON from clipboard instead of a file or console input;
v2.29 - Added printfile command to read a text file and print it to the console character by character. This is helpful for diagnosing encoding issues and weird text issues.;
v2.28 - Adding run sql command to execute SQL commands or SQL script files against a SQL Server database;
v2.27 - Adding support for json comments to JsonToClasses command;
v2.26 - Added command to sort references in a csproj file.
v2.25 - Added utility to check versions in bicep files and update to latest.
v2.24 - Added option to devtreeclean to preserve node_modules directories.
v2.23 - Added command to sort the values in the first PropertyGroup of a csproj file; Fixing bugs related to Process.Start() timeouts and stream reading in CreateSolutionCommand.
v2.22 - Added set package version command to update NuGet package versions in project files using optional package name filtering.
v2.21 - Modified set framework version command to more gracefully handle OS-specific targeting. Adding net8.0 and net9.0 to target frameworks.
v2.20 - Added prefix option to bulk rename command
v2.19 - Bug fixes; Support in class diagram for protected members; Class diagram option for showing locally defined members
v2.18 - Fixing bugs in formatxml command
v2.17 - Fixing bugs in class diagram generator
v2.16 - Restored the devtreeclean command which had been accidentally removed.
v2.15 - You don't wanna know. It was a mess.
v2.14 - Generate class diagrams for an assembly.
v2.13 - Added xml formatter command that allows recursive file processing.
v2.12 - Command to update or increment package version number and assembly version number.
v2.11 - Added support for setting values as json boolean in via setjsonvalue.
v2.10 - Fixed bug in setprojectproperty command where values were not updated if the property already existed.
v2.9 - Added assembly info viewer.
v2.8 - Added option to devtreeclean to keep git repositories when cleaning a directory tree.
v2.7 - Added wildcard reference command.
v2.6 - Updated nuget package to include Benday.CommandsFramework v3.2.0.
v2.5 - Updated jsontoclasses to add support for hyphens in json property names.