我有一个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
答案 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
的管道效率最低,因为你在循环中这样做会放大)
如果您想稍后使用该值(未在代码中显示),请将其分配并稍后再使用。