预加载模块文件所需的程序集:清单不起作用

Preloading assemblies needed by a module file: manifest not working

给出

UserMessage_class_script.ps1

Using module ".\UserMessage_class_script.psm1"
$processIcon = [System.Drawing.Icon]::ExtractAssociatedIcon($(Get-Process -id:$PID | Select-Object -expandProperty:path))
$message = [PxMessage]::GetInstance($processIcon)
$message.SendMessage('Title', "$(Get-Date)", 'Info')

UserMessage_class_script.psm1

class PxMessage {
    static [PxMessage] $instance
    static [Windows.Forms.NotifyIcon]$balloon
    static [System.Drawing.icon]$defaultIcon

    static [PxMessage] GetInstance($processIcon) {
        if ([PxMessage]::instance -eq $null) {
            [PxMessage]::instance = [PxMessage]::new()
            [PxMessage]::balloon = [Windows.Forms.NotifyIcon]::new()
            [PxMessage]::defaultIcon = $processIcon
        }

        return [PxMessage]::instance
    }

    [Void] SendMessage ([String]$title, [String]$message, [String]$messageIcon) {
        [PxMessage]::balloon.icon = [PxMessage]::defaultIcon
        [PxMessage]::balloon.balloonTipTitle = $title
        [PxMessage]::balloon.balloonTipText = $message
        [PxMessage]::balloon.balloonTipIcon = $messageIcon
        [PxMessage]::balloon.visible = $true 
        [PxMessage]::balloon.ShowBalloonTip(0)
        [PxMessage]::balloon.Dispose
    }
}

UserMessage_class_script.psd1

@{
    RootModule = 'UserMessage_class_script.psm1'
    GUID = '0e53745b-0b05-4bd3-8af2-f1595bca0167'
    RequiredAssemblies = @('System.Drawing', 'System.Windows.Forms')
}

并从快捷方式启动 UserMessage_class_script.ps1,而不是在 ISE 中加载和 运行 它,我的理解是 PSD1 文件应该预加载所需的程序集,以便当PSM1 文件由 PS1 文件中的 Using module 加载 PSM1 文件中 class 的类型属性不会引发错误。但是,这不是我所看到的。两个属性行都会引发 Unable to find type 错误。

现在,如果我添加

using assembly System.Drawing
using assembly System.Windows.Forms

在 PS1 文件中的 Using module 行之前,一切正常。哪种有意义,加载 PSM1 文件和编译 class 时存在程序集,类型可用。这解释得很好

但是这种方法使 PSM1 文件依赖于在 PS1 文件中准备环境,我认为我不需要这样做。所以我假设我在使用清单文件时做错了什么,尽管我一生都无法弄清楚是什么。

如果必须的话,主脚本中的两个Using assembly lines确实不是问题。但如果PSM1(或PSM1连同manifest)能自立,那就更好了。

我试图重现这个并发现了 2 个问题。如果您修复了该问题,它应该会按预期工作。

首先,您的 psd1 可能从未加载过。 Using module 需要 模块名称 (参见 docs),而不是 psm1 路径。如果您还没有这样做,请将您的模块放在 $Env:PSModulePath 中有效模块位置之一的文件夹中。文件夹结构应如下所示:

<module folder>
└───UserMessage_class_script
    └───UserMessage_class_script.psd1
    ├───UserMessage_class_script.psm1

然后更改 UserMessage_class_script.ps1 中的行以使用模块名称:

using module UserMessage_class_script

其次,Powershell 抱怨说 ModuleVersion 是必需的,所以请将其添加到您的 mainfest:

@{
    RootModule = 'UserMessage_class_script.psm1'
    ModuleVersion = "1.0.0.0"
    GUID = '0e53745b-0b05-4bd3-8af2-f1595bca0167'
    RequiredAssemblies = @('System.Drawing', 'System.Windows.Forms')
}

我按照这些步骤进行了操作,并且成功了。如果有帮助或您有任何疑问,请告诉我。