2017-02-02 20 views
1

Good Evening, Я тестирую классы Powershell в V5, и я не могу использовать отражение в классе Powershell. Возьмем следующий пример:Использование отражения в классе Powershell

class PSHello{ 
    [void] Zip(){ 
     Add-Type -Assembly "System.IO.Compression.FileSystem" 
     $includeBaseDirectory = $false 
     $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal 
     [System.IO.Compression.ZipFile]::CreateFromDirectory('C:\test', 'c:\test.zip',$compressionLevel ,$includeBaseDirectory) 
    } 
} 
$f = [PSHello]::new() 
$f.Zip() 

Как мы можем видеть, я загружая Ассамблею, а затем с помощью отражения Создать почтовый индекс каталога. Однако, когда это запустить я получаю ошибку

Unable to find type [System.IO.Compression.ZipFile]. 
+ CategoryInfo   : ParserError: (:) [],  ParentContainsErrorRecordException 
+ FullyQualifiedErrorId : TypeNotFound 

Теперь, если я запускаю то же самое содержание моего метода Zip вне класса он работает. Итак, почему нельзя отражать такое отражение внутри класса?

ответ

2

Методы класса IIRC предварительно скомпилированы, поэтому поздняя привязка не работает с использованием синтаксиса [type]. Я думаю, мы должны вызвать метод ZipFile вручную:

class foo { 

    static hidden [Reflection.Assembly]$FS 
    static hidden [Reflection.TypeInfo]$ZipFile 
    static hidden [Reflection.MethodInfo]$CreateFromDirectory 

    [void] Zip() { 
     if (![foo]::FS) { 
      $assemblyName = 'System.IO.Compression.FileSystem' 
      [foo]::FS = [Reflection.Assembly]::LoadWithPartialName($assemblyName) 
      [foo]::ZipFile = [foo]::FS.GetType('System.IO.Compression.ZipFile') 
      [foo]::CreateFromDirectory = [foo]::ZipFile.GetMethod('CreateFromDirectory', 
       [type[]]([string], [string], [IO.Compression.CompressionLevel], [bool])) 
     } 
     $includeBaseDirectory = $false 
     $compressionLevel = [IO.Compression.CompressionLevel]::Optimal 
     [foo]::CreateFromDirectory.Invoke([foo]::ZipFile, 
      @('c:\test', 'c:\test.zip', $compressionLevel, $includeBaseDirectory)) 
    } 

} 

$f = [foo]::new() 
$f.Zip() 
+0

Могучих интересно, спасибо за ваш ответ и объяснение вопрос – jladd

+0

Invoke-Expression может быть более простым решением ... – wOxxOm

 Смежные вопросы

  • Нет связанных вопросов^_^