2014-02-20 36 views
-1

我正在使用powershell。有一个用C#封装器编写的托管C++类。当我在Power Shell中创建这个类的实例并稍后调用它时,Powershell崩溃。看来powershell正在删除这些对象。我能做些什么来阻止PowerShell删除这些对象。Powershell垃圾收集器删除不应删除的.Net对象

'代码'

[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" 
} 

输出。这里是:我被破坏

任何想法。

+0

你应该更详细地解释你的问题。你到目前为止所描述的对我来说工作得很好。 –

+0

我在PowerShell中创建了托管C++类实例。 然后我在代码中稍后调用它。 所以有时当我运行整个脚本时,它没有任何问题,有时PowerShell崩溃。 所以我调查了它与视觉工作室,我发现了PowerShell崩溃,因为损坏的内存。 每个线索都有不同的PowerShell实例。 托管的C++代码是Unmanaged C++代码的封装。 –

+0

我使用powershell 3.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" 

,除非您使用新变量的-PassThru参数不分配什么$ newVar。