Как я могу избавиться от System.Xml.XmlWriter в PowerShell - PullRequest
10 голосов
/ 14 апреля 2009

Я пытаюсь избавиться от объекта XmlWriter:

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

Ошибка:

Ошибка вызова метода, потому что [System.Xml.XmlWellFormedWriter] не содержит метод с именем 'Dispose'.

С другой стороны:

 $writer -is [IDisposable]
 # True

Что мне делать?

Ответы [ 2 ]

11 голосов
/ 14 апреля 2009

Утилизация защищена на System.Xml.XmlWriter. Вы должны использовать Close вместо.

$writer.Close
8 голосов
/ 20 апреля 2009

Вот альтернативный подход:

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

Сценарий Get-Interface можно найти здесь http://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspx и был предложен в этом ответе .

С помощью ключевого слова using мы получаем:

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

}
...