Public/Install-TcLibrary.ps1

function Install-TcLibrary {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipeline = $true)]
        [System.__ComObject]
        $DteInstance,

        [Parameter(Mandatory = $true)]
        $Path,
        
        [string]
        $TmpPath = (Join-Path -Path ([System.IO.Path]::GetTempPath()) -ChildPath ([Guid]::NewGuid())),
        
        [string]
        $LibRepo = "System",

        [switch]$Force
    )

    begin {
        $CloseDteInstance = $false
    }

    process {
        if (!$DteInstance) {
            Start-MessageFilter
            $DteInstance = New-DteInstance -ErrorAction Stop
            $CloseDteInstance = $true
        }

        if (!(Test-Path $Path -PathType Leaf)) {
            throw "Provided library path $Path does not exist"
        }
        
        $dummyPrj = New-DummyTwincatSolution -DteInstance $DteInstance -Path $TmpPath
    
        try {
            $systemManager = $DteInstance.Solution.Projects.Item(1).Object
        }
        catch {
            throw "Failed to get the system manager object"
        }
        
        try {
            $references = $systemManager.LookupTreeItem("$($dummyPrj[0].PathName)^References")
        }
        catch {
            throw "Failed to look up the project references"
        }
        
        Write-Host "Installing library $Path to $LibRepo"
        
        if ($Force) { $forceInstall = $true }
        else { $forceInstall = $false }
            
        Write-Host "Forced installation set to ``$forceInstall``"
        
        try {
            $references.InstallLibrary($LibRepo, $Path, $forceInstall)
        }
        catch {
            throw "Failed to install $Path to $LibRepo"
        }
    
        Write-Host "Successfully installed $Path to $LibRepo"

        trap {
            Write-Error "$_"
            Remove-SideEffects -DteInstance $DteInstance -TmpPath $TmpPath -CloseDteInstance $CloseDteInstance
            break;
        }

        finally {
            Remove-SideEffects -DteInstance $DteInstance -TmpPath $TmpPath -CloseDteInstance $CloseDteInstance
        }
    }
}