2009-04-14 33 views
10

でSystem.Xml.XmlWriterを配置することができますどのように私は私がしたXmlWriterオブジェクトを配置しようとしていますPowerShellの

try 
{ 
    [System.Xml.XmlWriter] $writer = [System.Xml.XmlWriter]::Create('c:\some.xml') 
} 
finally 
{ 
    $writer.Dispose() 
} 

エラー:他の側では

Method invocation failed because [System.Xml.XmlWellFormedWriter] doesn't contain a method named 'Dispose'.

$writer -is [IDisposable] 
# True 

を私は何をすべきか?

答えて

11

protectedSystem.Xml.XmlWriterとなります。代わりにCloseを使用してください。ここで

$writer.Close 
+0

が保護されたメソッドを持って、どのように私はPowerShellでそれを呼び出すことができますか?タイプキャストは機能しません '($ writer -as [IDisposable])。Dispose()'。私は.Net Reflection APIを使うべきですか? – alex2k8

+0

Disposeの代わりにCall Closeを呼び出します。 Closeはすべてのリソースを解放します。 – Michael

+0

"間違った" Disposeについて話しています。彼が望む['Dispose'](http://msdn.microsoft.com/en-us/library/bb357166.aspx)は' '保護されていません。これは明示的なインタフェースの実装です!明示的なインターフェイスの実装は、PowerShellから呼び出すのが難しいです。しかし、この* hack *はうまくいくはずです: '[IDisposable] .GetMethod(" Dispose ")。Invoke($ writer、@())'。 –

8

は別のアプローチです:

(get-interface $obj ([IDisposable])).Dispose() 

のGet-インタフェーススクリプトがhttp://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspxここで見つけることができ、このresponseで示唆されました。 「を使用して」で

は、キーワード我々が得る:

$MY_DIR = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent 

# http://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspx 
. ($MY_DIR + '\get-interface.ps1') 

# A bit modified code from http://blogs.msdn.com/powershell/archive/2009/03/12/reserving-keywords.aspx 
function using 
{ 
    param($obj, [scriptblock]$sb) 

    try { 
     & $sb 
    } finally { 
     if ($obj -is [IDisposable]) { 
      (get-interface $obj ([IDisposable])).Dispose() 
     } 
    } 
} 

# Demo 
using($writer = [System.Xml.XmlWriter]::Create('c:\some.xml')) { 

} 
+0

powershell 2.0で 'using'を使用しています。このバージョンの言語では、 'using'キーワードはサポートされていません。ラインで :1つの文字:6 <<<< + CategoryInfo使用して+:ParserErrorを:(:) []、ParentContainsErrorRecordException + FullyQualifiedErrorId:ReservedKeywordNotAllowed –

+0

あなたは、試料が2.0で動作していないことを意味しています。それとも自分のコードが失敗したのでしょうか?もしそうなら、私は上記のサンプルで 'using'キーワードを自分で定義しなければならなかったことに気づくでしょう。 – alex2k8

関連する問題