Перейти к содержанию

Получение приватного .NET метода, вызывающего функцию Windows API

Текст для этой статьи пока не готов…

PowerShell Module
function Copy-RawItem {
    [CmdletBinding()]
    [OutputType([System.IO.FileSystemInfo])]
    Param (
        [Parameter(Mandatory = $True, Position = 0)]
        [ValidateNotNullOrEmpty()]
        [String]
        $Path,
        [Parameter(Mandatory = $True, Position = 1)]
        [ValidateNotNullOrEmpty()]
        [String]
        $Destination,
        [Switch]
        $FailIfExists
    )
    $mscorlib = [AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { 
        $_.Location -and ($_.Location.Split('\')[-1] -eq 'mscorlib.dll')
    }
    $Win32Native = $mscorlib.GetType('Microsoft.Win32.Win32Native')
    $CopyFileMethod = $Win32Native.GetMethod(
        'CopyFile', ([Reflection.BindingFlags] 'NonPublic, Static'))
    $CopyResult = $CopyFileMethod.Invoke(
        $null, @($Path, $Destination, ([Bool] $PSBoundParameters['FailIfExists'])))
    $HResult = [System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
    if ($CopyResult -eq $False -and $HResult -ne 0) {
        throw New-Object ComponentModel.Win32Exception($HResult)
    }
    else {
        Write-Output(Get-ChildItem $Destination)
    }
}

Примечание

Использованный здесь код доступен на GitHub: powershell-winapi-tutorial/examples/private-method.