PsDac.psm1

$LoadedAssemblies = [System.AppDomain]::CurrentDomain.GetAssemblies()

@(
    "$PSScriptRoot/Azure.Core.dll",
    "$PSScriptRoot/Azure.Identity.dll",
    "$PSScriptRoot/Microsoft.Identity.Client.dll",
    "$PSScriptRoot/Microsoft.SqlServer.Server.dll",
    "$PSScriptRoot/runtimes/win/lib/netcoreapp3.1/Microsoft.Data.SqlClient.dll"
) | ForEach-Object {
    [System.IO.FileInfo] $RequiredAssemblyPath = $_
    If ( -not $RequiredAssemblyPath.Exists ) {
        Write-Error "Build issue: '$RequiredAssemblyPath' does not exist."
    }
    $LoadedAssembly = $LoadedAssemblies | Where-Object Location -Like "*$( $RequiredAssemblyPath.Name )"

    if ( $LoadedAssembly ) {
        if ( $LoadedAssembly.Location -ne $RequiredAssemblyPath.FullName ) {
            Write-Warning "Assembly '$( $LoadedAssembly.GetName() )' already loaded from '$( $LoadedAssembly.Location )'. Skip adding defined dll."
        }
    }
    else {
        try {
            # Microsoft.Data.SqlClient.dll expects Data.SqlClient.SNI.dll in the same directory - copy Data.SqlClient.SNI.dll before adding SqlClient
            if ($RequiredAssemblyPath.Name -eq "Microsoft.Data.SqlClient.dll")
            { 
                $SNIPath = switch ($Env:PROCESSOR_ARCHITECTURE) 
                {
                    "AMD64" {"$PSScriptRoot\runtimes\win-x64\native\Microsoft.Data.SqlClient.SNI.dll"}     
                    "X86" {"$PSScriptRoot\runtimes\win-x86\native\Microsoft.Data.SqlClient.SNI.dll"}
                    "Arm" {"$PSScriptRoot\runtimes\win-arm\native\Microsoft.Data.SqlClient.SNI.dll"}              
                }
                Copy-Item $SNIPath -Destination "$PSScriptRoot\runtimes\win\lib\netcoreapp3.1\" -Force
            }
            Add-Type -Path $RequiredAssemblyPath
        }
        catch [System.IO.FileLoadException] {
            Write-Error "$( $_.Exception ) while adding assembly '$( $RequiredAssemblyPath.Name )'"
        }
    }
}