Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么powershell执行我的属性获取程序_Powershell - Fatal编程技术网

为什么powershell执行我的属性获取程序

为什么powershell执行我的属性获取程序,powershell,Powershell,我有一个C#项目,我正在使用PowerShell。 方法返回一个尚未完全初始化的对象,并通过getproperties在引擎盖下调用P/Invoke 当我调用该方法时,脚本会崩溃,因为在部分初始化的对象上调用属性会导致accessViolationException,但我没有调用它。 为什么Powershell会这样做?是否有一个选项可以禁用“急切的财产评估” 原始版本发布在此处: SetMedia返回一个VlcMedia,其中包含由PowerShell自动调用的Statistics属性 可以在

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

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

原始版本发布在此处:

SetMedia
返回一个
VlcMedia
,其中包含由PowerShell自动调用的
Statistics
属性


可以在这里找到VlcMedia的代码:

不看代码很难判断,但是有很多种方法可以做到这一点。如果显示对象,则可能正在读取所有属性

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

或者,更改getter以检测未初始化的对象(如果消费者可能最终使用这样的对象,那么您应该已经这样做了)

编辑: 您的代码已发布,很清楚:

$Plyr.SetMedia($Cameras[$i]) #Fails here with System.AccessViolationException
SetMedia
返回一个
VlcMedia
,其中包含由PowerShell自动调用的
Statistics
属性

PowerShell中返回的所有内容都会在某个地方出现。如果不分配或重定向它,它将被发送到管道

似乎您不想要或不需要此方法的输出,因此您应该将其分配给变量,或通过以下几种方式之一处理返回:

[null]$Plyr.SetMedia($Cameras[$i]) 
$null = $Plyr.SetMedia($Cameras[$i]) 
$Plyr.SetMedia($Cameras[$i]) | Out-Null
(注意:管道到
输出Null
的性能最低,由于在循环中执行此操作,因此会被放大)


如果您希望以后使用该值(代码中未显示),请分配该值并在以后使用。

如果不查看代码,很难判断,但有很多方法可以实现这一点。如果显示对象,则可能正在读取所有属性

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

或者,更改getter以检测未初始化的对象(如果消费者可能最终使用这样的对象,那么您应该已经这样做了)

编辑: 您的代码已发布,很清楚:

$Plyr.SetMedia($Cameras[$i]) #Fails here with System.AccessViolationException
SetMedia
返回一个
VlcMedia
,其中包含由PowerShell自动调用的
Statistics
属性

PowerShell中返回的所有内容都会在某个地方出现。如果不分配或重定向它,它将被发送到管道

似乎您不想要或不需要此方法的输出,因此您应该将其分配给变量,或通过以下几种方式之一处理返回:

[null]$Plyr.SetMedia($Cameras[$i]) 
$null = $Plyr.SetMedia($Cameras[$i]) 
$Plyr.SetMedia($Cameras[$i]) | Out-Null
(注意:管道到
输出Null
的性能最低,由于在循环中执行此操作,因此会被放大)

如果要稍后使用该值(代码中未显示),请分配该值并稍后使用