2009-04-14 12 views
10

我想處置XmlWriter對象:我如何處置System.Xml.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

System.Xml.XmlWriter上處置爲protected。您應該使用Close

$writer.Close 
+0

有一個保護的方法,我該怎麼稱呼它在PowerShell中?類型轉換不起作用'($ writer -as [IDisposable])。Dispose()'。我應該使用.Net Reflection API嗎? – alex2k8 2009-04-14 01:18:07

+0

呼叫關閉而不是處置。關閉發佈所有資源。 – Michael 2009-04-14 01:19:33

8

這是一種替代方法:

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

獲取接口腳本可以在這裏找到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')) { 

}