簡體   English   中英

為什么Powershell執行我的屬性獲取器

[英]Why does powershell executes my property getters

我有一個正在使用PowerShell的C#項目。 一個方法返回一個尚未完全初始化的對象,該對象通過get屬性在內部調用P / Invoke。

當我調用該方法時,腳本由於accessViolationException異常而崩潰,該異常是由對該部分初始化的對象的屬性的調用引起的,但是我沒有調用它。 為什么Powershell會這樣? 有沒有一個選項可以禁用“渴望屬性評估”?

原始問題是發布在這里的問題: https : //github.com/ZeBobo5/Vlc.DotNet/issues/330

Add-Type -Path ".\Other\VLC\Vlc.DotNet.Core.dll"
Add-Type -Path ".\Other\VLC\Vlc.DotNet.Core.Interops.dll"

$Cameras = New-Object System.Collections.ArrayList
$Test = New-Object System.Uri("rtsp://192.168.0.50/axis-media/media.amp?camera=1")
$Cameras.Add($Test)

$VlcLibDirPath = (Get-Location).Path + ".\Other\VLC\libvlc_x64"
$VlcLibDir = New-Object System.IO.DirectoryInfo($VlcLibDirPath)
$VlcOpt = "--rtsp-user=admin", "--rtsp-pwd=12345"
$Plyr = New-Object Vlc.DotNet.Core.VlcMediaPlayer($VlcLibDir, $VlcOpt)
for ($i=0; $i -lt $Cameras.Count; $i++)
{
    $Plyr.SetMedia($Cameras[$i]) #Fails here with System.AccessViolationException
    $Plyr.Play
    $Plyr.Stop
}

SetMedia返回VlcMedia ,其中包含一個Statistics屬性,該屬性由PowerShell自動調用。

VlcMedia代碼可以在這里找到: https : //github.com/ZeBobo5/Vlc.DotNet/blob/develop/src/Vlc.DotNet.Core/VlcMedia/VlcMedia.cs

沒有看到您的代碼很難說,但是可能有很多方式發生。 如果根本不顯示該對象,則可能正在讀取所有屬性。

您應該將它們更改為方法,然后不進行專門調用就不會讀取它們。

或者,更改您的吸氣劑以檢測未初始化的對象(如果消費者有可能最終使用此類對象,則應該已經這樣做了)。

編輯:

張貼代碼后,很明顯:

$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的性能最低,因為您是在循環中執行此操作,所以放大了)

如果要稍后使用該值(代碼中未顯示),請分配它並稍后使用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM