预加载模块文件所需的程序集:清单不起作用
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')
}
我按照这些步骤进行了操作,并且成功了。如果有帮助或您有任何疑问,请告诉我。
给出
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')
}
我按照这些步骤进行了操作,并且成功了。如果有帮助或您有任何疑问,请告诉我。