10

I am trying to dispose XmlWriter object:

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

Error:

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

On the other side:

 $writer -is [IDisposable]
 # True

What should I do?

2 Answers 2

11

Dispose is protected on System.Xml.XmlWriter. You should use Close instead.

$writer.Close
Sign up to request clarification or add additional context in comments.

3 Comments

Having a protected method, how can I call it in PowerShell? Type cast does not work '($writer -as [IDisposable]).Dispose()'. Should I use .Net Reflection API??
Call Close instead of Dispose. Close releases all resources.
You're talking about the "wrong" Dispose. The Dispose he wants is not protected; it is an explicit interface implementation! Explicit interface implementations are hard to call from PowerShell. But this hack should work: [IDisposable].GetMethod("Dispose").Invoke($writer, @()).
8

Here is an alternative approach:

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

Get-Interface script can be found here http://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspx and was suggested in this response.

With 'using' keyword we get:

$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')) {

}

2 Comments

using 'using' in powershell 2.0 i get: The 'using' keyword is not supported in this version of the language. At line:1 char:6 + using <<<< + CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException + FullyQualifiedErrorId : ReservedKeywordNotAllowed
Do you mean that the sample is not working on 2.0. Or it's your own code fails - if so, notice that I had to defined the 'using' keyword in sample above by myself.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.