ImportPackage.ps1


<#PSScriptInfo
 
.VERSION 1.0
 
.GUID ed896e0c-b20d-4d70-b894-ac698a1032cb
 
.AUTHOR Mavaddat Javid
 
.COMPANYNAME Mav Jav Education
 
.COPYRIGHT 2023
 
.TAGS package NuGet PackageManagement assembly dll
 
.LICENSEURI https://creativecommons.org/licenses/by/4.0/
 
.PROJECTURI https://gist.github.com/mavaddat/698408014b9fa3a0c1307c5104f5276d
 
.ICONURI https://i.imgur.com/YOxIHjx.png
 
.EXTERNALMODULEDEPENDENCIES
 
.REQUIREDSCRIPTS
 
.EXTERNALSCRIPTDEPENDENCIES
 
.RELEASENOTES
First version; Requires PowerShell Core 6+ for now.
 
.PRIVATEDATA
 
#>


#Requires -Module PackageManagement

<#
 
.DESCRIPTION
 A cmdlet to enable easy importing of assemblies (DLL) from installed NuGet packages into the current PowerShell session.
 
#>
 

Param()


function Import-Package {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, ParameterSetName = 'Name')]
        [ValidateScript({
                if (Get-Package -Name $_ -ErrorAction SilentlyContinue) {
                    $true
                }
                else {
                    throw "Package '$($_)' not found"
                }
            })]
        [ArgumentCompleter({ Get-Package -AllVersions | Select-Object -ExpandProperty Name })]
        [string]$PackageName,
        [Parameter(Mandatory, ValueFromPipeline, ValueFromPipelineByPropertyName, ParameterSetName = 'Path')]
        [ValidateNotNullOrEmpty()]
        [string]$Path
    )       
    
    begin {
        switch ($PSEdition) {
            Core { $script:filter = 'netstandard*'; break }
            Desktop { $script:filter = 'net*'; break }
            Default { $script:filter = 'net*'; break }
        }
    }
    process {
        # if using name, get path
        switch ($PSCmdlet.ParameterSetName) {
            Name {
                Get-Package -Name $PackageName | ForEach-Object {
                    Write-Verbose -Message "Importing package '$($_.Name)' $($_.Version) installed from '$($_.ProviderName)'"
                    Add-Type -LiteralPath ( $_.Source | Split-Path | Get-ChildItem -Filter $script:filter -Recurse -Directory | Get-ChildItem -Filter *.dll -Recurse -File | Select-Object -Last 1).FullName -Verbose:$VerbosePreference
                }
                break
            }
            Path {
                $__PackageName = Get-Package -Verbose:$VerbosePreference | Select-Object -ExpandProperty Source | Split-Path -Parent | Split-Path -Leaf | Select-String -Pattern '\D+(?=\.[\d\.]+)' -AllMatches | Where-Object { -not [string]::IsNullOrWhiteSpace($_.Matches.Value) -and $Path -match [regex]::Escape($_.Matches.Value) } 
                Import-Package -PackageName $__PackageName.Matches.Value -Verbose:$VerbosePreference    
                break
            }
        }
    }
}