2017-02-02 4 views
1

おはよう、 PowerShellクラスをV5でテストしており、Powershellクラス内でリフレクションを使用できません。以下の例を見てみましょう:私たちが見ることができるように、私はディレクトリのzipファイルを作成するためにリフレクションを使用した後、アセンブリをロードしています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 

のエラーを受け取ります。だから、リフレクションは、このようなクラスの中で使うことができないのはなぜですか?

答えて

2

IIRCクラスのメソッドはプリコンパイルされているため、[バインディング]構文を使用してもバインディングが機能しません。私たちは手動でZIPファイルのメソッドを呼び出す必要がありますね:

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

起動式の解答と解説をありがとうございました... – wOxxOm

関連する問題