2009-04-14 13 views
10

Sto cercando di smaltire oggetto XmlWriter:Come posso smaltire System.Xml.XmlWriter in PowerShell

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

Errore:

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

Dall'altra parte:

$writer -is [IDisposable] 
# True 

Cosa dovrei fare?

risposta

11

Dispose è protected su System.Xml.XmlWriter. Dovresti usare invece Close.

$writer.Close 
+0

Avere un metodo protetto, come posso chiamarlo in PowerShell? Digitare cast non funziona '($ writer -as [IDisposable]). Dispose()'. Dovrei usare .Net Reflection API ?? – alex2k8

+0

Chiama Chiudi invece di Disponi. Chiudi rilascia tutte le risorse. – Michael

+0

Stai parlando del "male" 'Dispose'. Il ['Dispose' che desidera] (http://msdn.microsoft.com/en-us/library/bb357166.aspx) non è' protected'; è un'implementazione esplicita dell'interfaccia! Implementazioni di interfacce esplicite sono difficili da chiamare da PowerShell. Ma questo * hack * dovrebbe funzionare: '[IDisposable] .GetMethod (" Dispose "). Invoke ($ writer, @())'. –

8

Ecco un approccio alternativo:

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

script Get-Interface può essere trovato qui http://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspx ed è stato suggerito in questo response.

Con 'usando' parola chiave otteniamo:

$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

utilizzando 'using' in PowerShell 2.0 ottengo: La parola chiave 'using' non è supportata in questa versione della lingua. alla riga: 1 char: 6 + utilizzando <<<< + CategoryInfo: ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId: ReservedKeywordNotAllowed –

+0

vuoi dire che il campione non sta lavorando su 2.0. Oppure il tuo codice fallisce - in tal caso, nota che ho dovuto definire da solo la parola chiave 'using' nell'esempio sopra. – alex2k8

Problemi correlati