0

在 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')

它在 ISE 中有效,但在从快捷方式运行时不在控制台中。我明白了Unable to find type [system.drawing.icon].

显然第一个 Add-Type 有效,我在 New-Object 上没有错误。那么为什么第二种加载失败呢?我还尝试将两个 Add-Type 行移出类,并移入模块文件的根目录,结果相同。起作用的是将这些行添加到 PS1 using module(必须是第一个非标记行)和呼叫之间。那行得通,但是你没有一个自包含的类,这似乎有点糟糕。我在这里有什么误解?

如何创建一个使用 .NET 类型的自包含类并从模块文件中使用它?

4

1 回答 1

0

对于任何有兴趣的人,我想出的解决方案如下。在 library.PSM1 我有...

class pxInitFailureMessage {
    static [void] Send ([int32]$processID, [String]$title, [string]$message, [System.Drawing.Icon]$icon) {
        Add-Type -AssemblyName:System.Windows.Forms
        $balloonTip = New-Object System.Windows.Forms.NotifyIcon
        $balloonTip.icon = $icon
        $balloonTip.balloonTipIcon = 'Error'
        $balloonTip.balloonTipTitle = $title
        $balloonTip.balloonTipText = $message
        $balloonTip.visible = $true 
        $balloonTip.ShowBalloonTip(0)
        $balloonTip.Dispose
    }
}

在我的脚本中,我有...

using assembly System.Drawing
Using module '.\library.psm1'

$processIcon = [system.drawing.icon]::ExtractAssociatedIcon($(Get-Process -id:$pID | Select-Object -expandProperty:Path))

[pxInitFailureMessage]::Send($pid, 'Title', 'Message is just some extra text', $processIcon)

关键是该类现在是自包含的,并且遵循为该类提供所需的一切的良好实践,因此它不必向外寻找。我可以很容易地使用我自己的 ICO 文件作为图标,就像这样......

$processIcon = [system.drawing.icon]::New('\\Mac\iCloud Drive\Px Tools 4.#\Dev 4.0\Px_Resources\PxIcon.ico')

在此示例中再次使用文字路径。

所以,我今天学到了一件事。呜呜。

于 2020-06-01T15:49:08.543 回答