Update targetframework for .NET Core projects with PowerShell

1 minute read

With the recent release of .NET Core 3.1 last Wednesday, I decided to upgrade to current project I’m working on from .NET Core 3.0 to .NET Core 3.1. This sounds easy right?

Well not if the solution contains a mix 48 .NET Core 3 and .NET Standard 2.1 projects. And this time I decided not to do this manually.

I recently found a PowerShell script on the internet which allowed me to add a property to all .csproj files in the solution. So I grabbed this as my starting point, because now that I could to that it shouldn’t be that difficult to update properties in a similar way :-)

Fortunately it didn’t cost me much time to create a script that could do this for me. Even with a configurable boolean to make sure I’m not overwriting any .NET Standard projects.

Below is the script. Which is also hosted on my GitHub by the way!

#find all csproj files recursive in this directory
$paths = Get-ChildItem -include *.csproj -Recurse

$OnlyUpdateMatchingFrameworks = $true #can also be #false

$desiredTargetFramework = "netcoreapp3.1"

#foreach found file, update the framework
foreach($pathobject in $paths)
{
    $path = $pathobject.fullname
    $doc = New-Object System.Xml.XmlDocument
    $doc.Load($path)
    $node = $doc.SelectSingleNode("//Project/PropertyGroup")
	$TargetFrameworkNode = $node.SelectSingleNode("TargetFramework")
	
	if (-not $TargetFrameworkNode) {
       write-host "Node does not exist!"
    }
    else {
        write-host "Node found!"

        write-host "value was" + $TargetFrameworkNode.InnerText

        if($OnlyUpdateMatchingFrameworks -eq $true)
        {
            write-host "Only matching nodes may be updated! Checking.."

            if($TargetFrameworkNode.InnerText -like "netcoreapp*")
            {
                write-host "Updating node!"

                $TargetFrameworkNode.InnerText = $desiredTargetFramework    
            }
        }
        else{
            write-host "Updating node!"

            $TargetFrameworkNode.InnerText = $desiredTargetFramework
        }        

        write-host "value is" + $TargetFrameworkNode.InnerText

        $doc.Save($pathobject)
    }    
}

Updated: