В PS1 это работает
class pxInitFailureMessage {
static [void] Send ([int32]$processID, [String]$title, [string]$message) {
Add-Type -AssemblyName:System.Windows.Forms
Add-Type -AssemblyName:System.Drawing
$balloonTip = New-Object System.Windows.Forms.NotifyIcon
$balloonTip.icon = [system.drawing.icon]::ExtractAssociatedIcon($(Get-Process -id:$processID | Select-Object -expandProperty:Path))
$balloonTip.balloonTipIcon = 'Error'
$balloonTip.balloonTipTitle = $title
$balloonTip.balloonTipText = $message
$balloonTip.visible = $true
$balloonTip.ShowBalloonTip(0)
$balloonTip.Dispose
}
}
[pxInitFailureMessage]::Send($pid, 'Title', 'Message is just some extra text')
Но переместите этот класс в файл library.PSM1, а это в PS1.
Using module '\\Mac\iCloud Drive\Px Tools 4.#\Dev 4.0\#Spikes\Windows7\library.psm1'
[pxInitFailureMessage]::Send($pid, 'Title', 'Message is just some extra text')
И работает в ИСЕ, а не в консоли при запуске с ярлыка. я получаю Unable to find type [system.drawing.icon].
Очевидно, что первый Add-Type работает, я не получаю ошибок в New-Object. Так почему же второй тип нагрузки не работает? Я также попытался переместить две строки Add-Type из класса в корень файла модуля с теми же результатами. Что ДЕЙСТВИТЕЛЬНО работает, так это добавление этих строк в PS1 между using module
(которая должна быть первой незамеченной строкой) и вызовом. Это работает, но тогда у вас нет автономного класса, что кажется немного отстойным. Что я здесь неправильно понимаю?
Как создать автономный класс, использующий типы .NET, и работать с ним из файла модуля?
Get-Module Microsoft.PowerShell.Diagnostics -List | Format-List -Property *
, и он вернул ожидаемую информацию. НоGet-Module System.Drawing.Icon -List | Format-List -Property *
иGet-Module System.Drawing -List | Format-List -Property *
вообще ничего не возвращают. Тем не менее, я ожидаю, что это будет полезная ссылка, когда я буду углубляться в .NET через PS. Так вот! - person Gordon   schedule 01.06.2020I also tried moving the two Add-Type lines out of the class, and into the root of the module file, with the same result
Когда команды включаютclass
, PowerShell сначала оценивает (анализирует) их. Итак, вам нужно сначала загрузить сборки каким-то образом... - person 7cc   schedule 01.06.2020using assembly System.Drawing
имеет смысл, потому что именно там мне это нужно и я использую. Таким образом, даже если бы мой первоначальный подход сработал, это все равно было бы плохим решением. - person Gordon   schedule 01.06.2020