[英]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.