Public/New-BinaryModuleManifest.ps1

function New-BinaryModuleManifest
{
    param
    (
        [Parameter(Mandatory)]
        [string]$Path,

        [Parameter(Mandatory)]
        [string]$ModulePath,

        [Parameter(Mandatory)]
        [string]$Guid,

        [switch]$Hybrid,
        [string]$Author,
        [string]$CompanyName,
        [string]$Copyright,
        [string]$Description,
        [string]$ModuleName = (Get-Item -Path $ModulePath).Name
    )

    $OutputFolderPath = Split-Path -Path $Path -Parent

    $DllFileName = "$($ModuleName).dll"
    $ScriptFileName = "$($ModuleName).psm1"

    if ($Hybrid)
    {
        $RootModuleFileName = $ScriptFileName
        $NestedModules = @($DllFileName)
    }
    else
    {
        $RootModuleFileName = $DllFileName
        $NestedModules = @()
    }

    $DllFilePath = Join-Path -Path $OutputFolderPath -ChildPath $DllFileName
    $ModuleVersion = (Get-Item -Path $DllFilePath).VersionInfo.ProductVersion -replace '\+.*$', ''
    $TypesPath = Join-Path -Path $ModulePath -ChildPath 'types.ps1xml'
    $TypesToProcess = if (Test-Path -Path $TypesPath) { "$ModuleName.types.ps1xml" }
    $FormatsPath = Join-Path -Path $ModulePath -ChildPath 'format.ps1xml'
    $FormatsToProcess = if (Test-Path -Path $FormatsPath) { "$ModuleName.format.ps1xml" }

    $Types = Add-Type -Path $DllFilePath -PassThru
    $CmdletNames = $Types | ForEach-Object { $_.GetCustomAttributes($true) } | Where-Object { $_ -is [System.Management.Automation.CmdletAttribute] } | ForEach-Object { "$($_.VerbName)-$($_.NounName)" } | Select-Object -Unique
    $AliasNames = $Types | ForEach-Object { $_.GetCustomAttributes($true) } | Where-Object { $_ -is [System.Management.Automation.AliasAttribute] } | ForEach-Object { $_.AliasNames } | Select-Object -Unique

    Write-Verbose "Module Name: $ModuleName"
    Write-Verbose "Module Version: $ModuleVersion"
    Write-Verbose "Root Module Path: $RootModuleFileName"
    Write-Verbose "Nested Module Paths: $NestedModules"
    Write-Verbose "Types Path: $TypesPath"
    Write-Verbose "Types to Process: $TypesToProcess"
    Write-Verbose "Formats Path: $FormatsPath"
    Write-Verbose "Formats to Process: $FormatsToProcess"
    Write-Verbose "Cmdlet Names: $CmdletNames"
    Write-Verbose "Alias Names: $AliasNames"

    New-ModuleManifest `
        -Path $Path `
        -RootModule $RootModuleFileName `
        -NestedModules $NestedModules `
        -ModuleVersion $ModuleVersion `
        -Guid $Guid `
        -Author $Author `
        -CompanyName $CompanyName `
        -Copyright $Copyright `
        -Description $Description `
        -TypesToProcess $TypesToProcess `
        -AliasesToExport $AliasNames `
        -FormatsToProcess $FormatsToProcess `
        -CmdletsToExport $CmdletNames
}