2009-04-14 6 views
10

entsorgen Ich versuche XmlWriter-Objekt zu entsorgen:Wie kann ich System.Xml.XmlWriter in Powershell

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

Fehler:

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

Auf der anderen Seite:

$writer -is [IDisposable] 
# True 

Was soll ich machen?

Antwort

11

Dispose ist protected auf System.Xml.XmlWriter. Sie sollten stattdessen Close verwenden.

$writer.Close 
+0

eine geschützte Methode zu haben, wie kann ich es in Powershell anrufen? Typumwandlung funktioniert nicht '($ writer -as [IDisposable]). Dispose()'. Soll ich die .Net Reflection API verwenden? – alex2k8

+0

Rufen Sie Close anstelle von Dispose auf. Close gibt alle Ressourcen frei. – Michael

+0

Sie sprechen über das "falsche" 'Dispose'. Das ['Dispose', das er will] (http://msdn.microsoft.com/en-us/library/bb357166.aspx) ist nicht" geschützt "; es ist eine explizite Schnittstellenimplementierung! Explizite Schnittstellenimplementierungen sind nur schwer von PowerShell aus zu erreichen. Aber dieser * Hack * sollte funktionieren: '[IDisposable] .GetMethod (" Dispose "). Invoke ($ writer, @())'. –

8

Hier ist ein alternativer Ansatz:

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

Get-Interface-Skript finden Sie hier http://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspx werden kann, und wurde in diesem response vorgeschlagen.

Mit ‚mit‘ Stichwort erhalten wir:

$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

using 'using' in Powershell 2.0 Ich bekomme: Das Schlüsselwort 'using' wird in dieser Version der Sprache nicht unterstützt. Bei Zeile: 1 Zeichen: 6 mit + <<<< + CategoryInfo: ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId: ReservedKeywordNotAllowed –

+0

Haben Sie bedeuten, dass die Probe nicht auf 2.0 funktioniert. Oder es ist Ihr eigener Code fehlgeschlagen - wenn ja, beachten Sie, dass ich das 'using' Schlüsselwort im obigen Beispiel selbst definieren musste. – alex2k8

Verwandte Themen