为什么powershell会执行我的属性getter

时间:2017-10-16 21:51:33

标签: powershell

我有一个C#项目,我正在使用PowerShell。 方法返回一个尚未完全初始化的对象,并通过SetMedia属性调用P / Invoke。

当我调用该方法时,由于在该部分初始化对象上调用属性引起的accessViolationException,脚本崩溃,但我没有调用它。 为什么Powershell会这样?是否可以选择禁用“急切的财产评估”?

原始问题是此处发布的问题:https://github.com/ZeBobo5/Vlc.DotNet/issues/330

VlcMedia

Statistics返回VlcMedia,其中包含+--------+-------------+--------+ | userId | leaderboard | points | +--------+-------------+--------+ | 1 | lead1 | 10 | | 1 | lead2 | 20 | | 1 | lead1 | 5 | | 2 | lead2 | 10 | | 2 | lead1 | 10 | | 2 | lead1 | 15 | | 3 | lead2 | 15 | +--------+-------------+--------+ 属性,PowerShell会自动调用该属性。

{{1}}代码可在此处找到:https://github.com/ZeBobo5/Vlc.DotNet/blob/develop/src/Vlc.DotNet.Core/VlcMedia/VlcMedia.cs

1 个答案:

答案 0 :(得分:3)

如果没有看到您的代码,很难分辨,但有很多方法可以实现。如果正在显示对象,则可能都在读取属性。

您应该将这些更改为方法,然后在没有特别调用的情况下不会读取它们。

或者,更改你的getter以检测未初始化的对象(如果消费者可能最终得到这样的对象,你应该这样做。)

编辑:

发布您的代码后,很清楚:

$Plyr.SetMedia($Cameras[$i]) #Fails here with System.AccessViolationException
  

SetMedia返回VlcMedia,其中包含Statistics属性,PowerShell会自动调用该属性。

PowerShell中返回的所有内容都在某处。如果您不指定或重定向它,它将被发送到管道。

您似乎不想要或不需要此方法的输出,因此您应该将其分配给变量或以下列方式之一处置退货:

[null]$Plyr.SetMedia($Cameras[$i]) 
$null = $Plyr.SetMedia($Cameras[$i]) 
$Plyr.SetMedia($Cameras[$i]) | Out-Null

(注意:到Out-Null的管道效率最低,因为你在循环中这样做会放大)

如果您想稍后使用该值(未在代码中显示),请将其分配并稍后再使用。