Public/Import-DPLibrary.ps1
|
function Import-DPLibrary { <# .SYNOPSIS Import DLLPickle libraries based on Packages.json configuration. .DESCRIPTION Import all DLLs (libraries) that are tracked and marked for auto-import in the Packages.json file. .PARAMETER ImportAll Ignore preset 'autoImport' values and attempt to import all packages. .EXAMPLE Import-DPLibrary Imports all DLLPickle libraries marked for auto-import. .EXAMPLE Import-DPLibrary -ImportAll Imports all DLLPickle libraries, ignoring auto-import settings. .OUTPUTS System.Management.Automation.PSCustomObject Returns information about imported libraries. #> [CmdletBinding()] param ( # Ignore preset 'autoImport' values and attempt to import all packages. [Parameter()] [switch] $ImportAll ) # Determine module directory. $ModuleDirectory = if ($PSModuleRoot) { $PSModuleRoot } elseif ($PSScriptRoot) { Split-Path -Path $PSScriptRoot -Parent } else { $PWD } $LibraryDirectory = Join-Path -Path $ModuleDirectory -ChildPath 'Lib' $PackagesJsonPath = Join-Path -Path $LibraryDirectory -ChildPath 'Packages.json' if (-not (Test-Path -Path $PackagesJsonPath)) { throw "Packages.json not found at: $PackagesJsonPath" } try { $Packages = Get-Content -Path $PackagesJsonPath | ConvertFrom-Json | Select-Object -ExpandProperty packages } catch { throw "Failed to read or parse Packages.json at: $PackagesJsonPath. Error: $_" } # Import each package as per the autoImport setting or ImportAll flag and record the results. $Results = foreach ($Package in $Packages) { $FilePath = Join-Path -Path $LibraryDirectory -ChildPath "$($Package.name).dll" if ($Package.autoImport -or $ImportAll) { if (-not (Test-Path -Path $FilePath)) { Write-Warning "DLL not found: $FilePath" [PSCustomObject]@{ PackageName = $Package.name Version = $Package.version Status = 'Not Found' Error = 'File does not exist' } continue } try { # Check if assembly is already loaded $AssemblyName = [System.Reflection.AssemblyName]::GetAssemblyName($FilePath) $LoadedAssembly = [System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.GetName().Name -eq $AssemblyName.Name } if ($LoadedAssembly) { Write-Verbose "Assembly already loaded: $($Package.name)" [PSCustomObject]@{ PackageName = $Package.name Version = $Package.version Status = 'Already Loaded' Error = $null } } else { Add-Type -Path $FilePath Write-Verbose "Successfully imported: $($Package.name)" [PSCustomObject]@{ PackageName = $Package.name Version = $Package.version Status = 'Imported' Error = $null } } } catch { Write-Warning "Failed to import $($Package.name): $_" [PSCustomObject]@{ PackageName = $Package.name Version = $Package.version Status = 'Failed' Error = $_.Exception.Message } } } else { Write-Verbose "Skipping auto-import for $($Package.name)." [PSCustomObject]@{ PackageName = $Package.name Version = $Package.version Status = 'Skipped' Error = $null } } } $Results } |