Powershell Garbage Collector删除不应删除的.Net对象

时间:2014-02-20 15:06:58

标签: powershell memory-management garbage-collection

我正在使用powershell。有一个用托管C ++编写的类,它有C#包装器。当我在power shell中创建这个类的实例并稍后再调用它时,Powershell崩溃了。似乎powershell正在删除这些对象。我该怎么做才能阻止PowerShell删除这些对象。

'代码'

[int] $i

{
    $i = New-Object int;
    $i = 20;
}
Write-Host $i


for( [long] $j = 0; $j -le 1000; $j++ )
{
    $newVar = New-Variable "aNewObject$j" 
    $newVar = $j;  
}

if($i -eq $null)
{
    Write-Host "I is destroyed"
}

这里的输出是: 20 我被摧毁了

任何想法。

1 个答案:

答案 0 :(得分:1)

我认为您对PowerShell范围存在误解。这可以按照您的预期运行:

[int] $i
#{
$i = New-Object int;
$i = 20;
#}
Write-Host "i is $i"

for( [long] $j = 4000; $j -le 5000; $j++ )
{
    $newVar = New-Variable "aNewObject$j" 
    $newVar = $j;  
}

if($i -eq $null)
{
    Write-Host "I is destroyed"
}

当您在作用域内部({}内)设置变量时,PowerShell会执行copy-on-write操作,以便在该作用域内修改变量的副本。这是为了防止您不知道调用您的函数所使用的变量的脚本中的混乱。请记住,PowerShell使用动态范围而不是词法范围。

此外,这一行:

$newVar = New-Variable "aNewObject$j" 
除非在New-Variable上使用-PassThru参数,否则

不会为$ newVar分配任何内容。