【问题标题】:How can I dispose System.Xml.XmlWriter in PowerShell如何在 PowerShell 中处理 System.Xml.XmlWriter
【发布时间】:2009-04-14 00:57:55
【问题描述】:

我正在尝试处理 XmlWriter 对象:

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

错误:

方法调用失败,因为 [System.Xml.XmlWellFormedWriter] 不包含名为的方法 '处理'。

另一边:

 $writer -is [IDisposable]
 # True

我该怎么办?

【问题讨论】:

    标签: powershell dispose idisposable


    【解决方案1】:

    Dispose 是 protected on System.Xml.XmlWriter。你应该改用Close

    $writer.Close
    

    【讨论】:

    • 有一个受保护的方法,如何在 PowerShell 中调用它?类型转换不起作用 '($writer -as [IDisposable]).Dispose()'。我应该使用 .Net 反射 API 吗??
    • 调用 Close 而不是 Dispose。关闭释放所有资源。
    • 您在谈论“错误”DisposeDispose he wants 不是 protected;它是一个显式的接口实现!显式接口实现很难从 PowerShell 中调用。但是这个 hack 应该可以工作:[IDisposable].GetMethod("Dispose").Invoke($writer, @()).
    【解决方案2】:

    这是另一种方法:

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

    Get-Interface 脚本可在此处http://www.nivot.org/2009/03/28/PowerShell20CTP3ModulesInPracticeClosures.aspx 找到,并在此response 中提出建议。

    使用 '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')) {
    
    }
    

    【讨论】:

    • 在 powershell 2.0 中使用 'using' 我得到:此版本的语言不支持 'using' 关键字。在 line:1 char:6 + using
    • 您的意思是该示例不适用于 2.0。或者是您自己的代码失败 - 如果是这样,请注意我必须自己在上面的示例中定义“使用”关键字。
    猜你喜欢
    • 2016-07-18
    • 2011-01-10
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 1970-01-01
    相关资源
    最近更新 更多