Public/DotNet/Switch-ReferencesVersion.ps1

function Switch-ReferenceVersion() {
    param(
        [string]$modulePath, 
        [version]$Version,
        [string]$referenceFilter,
        [string]$snkFile,
        [System.IO.FileInfo[]]$assemblyList
    )
    if (!$assemblyList){
        $packagesFolder=Get-PackagesFolder
        $assemblyList=Get-ChildItem $packagesFolder -Include "*.dll","*.exe" -Recurse
    }
    $moduleAssemblyData = Get-MonoAssembly $modulePath $assemblyList -ReadSymbols
    $moduleAssembly = $moduleAssemblyData.assembly
    $moduleReferences = $moduleAssembly.MainModule.AssemblyReferences
    wh "References:" -Style Underline
    $moduleReferences.Fullname |Sort-Object
    $needsPatching = $false
    $moduleReferences.ToArray() | Where-Object { $_.Name -like $referenceFilter } | ForEach-Object {
        $dxReference = $_
        "Checking reference $_..."
        if ($dxReference.Version -ne $Version) {
            $moduleReferences.Remove($dxReference) | Out-Null
            $newMinor = "$($Version.Major).$($Version.Minor)"
            $newName = [Regex]::Replace($dxReference.Name, "\.v\d{2}\.\d", ".v$newMinor")
            $regex = New-Object Regex("PublicKeyToken=([\w]*)") 
            $token = $regex.Match($dxReference).Groups[1].Value
            $regex = New-Object Regex("Culture=([\w]*)")
            $culture = $regex.Match($dxReference).Groups[1].Value
            $newReference = [AssemblyNameReference]::Parse("$newName, Version=$($Version), Culture=$culture, PublicKeyToken=$token")
            $moduleReferences.Add($newreference)
            $moduleAssembly.MainModule.Types | ForEach-Object {
                $moduleAssembly.MainModule.GetTypeReferences() | Where-Object { $_.Scope -eq $dxReference } | ForEach-Object { 
                    $_.Scope = $newReference 
                }
            }
            wh "$($_.Name) version will changed from $($_.Version) to $($Version)`r`n" -ForegroundColor Blue
            $needsPatching = $true
        }
        else {
            wh "$($_.Name) Version ($($dxReference.Version)) matched nothing to do.`r`n" -ForegroundColor Blue
        }
    }
    if ($needsPatching) {
        wh "Patching $modulePath" -ForegroundColor Yellow
        $writeParams = New-Object WriterParameters
        $writeParams.WriteSymbols = $moduleAssembly.MainModule.hassymbols
        $key = [File]::ReadAllBytes($snkFile)
        $writeParams.StrongNameKeyPair = [System.Reflection.StrongNameKeyPair]($key)
        if ($writeParams.WriteSymbols) {
            $pdbPath = Get-Item $modulePath
            $pdbPath = "$($pdbPath.DirectoryName)\$($pdbPath.BaseName).pdb"
            $symbolSources = Get-SymbolSources $pdbPath
        }
        $moduleAssembly.Write($writeParams)
        wh "Patched $modulePath" -ForegroundColor Green
        if ($writeParams.WriteSymbols) {
            "Symbols $modulePath"
            if ($symbolSources -notmatch "is not source indexed") {
                Update-Symbols -pdb $pdbPath -SymbolSources $symbolSources
            }
            else {
                $symbolSources 
            }
        }
    }
    $moduleAssemblyData.Resolver.Dispose()
    $moduleAssembly.Dispose()
}