类内调用System.Windows.Forms.MessageBox出现类型未找到错误
类作用域未显式导入命名空间
PowerShell的类定义拥有独立作用域,不会自动继承全局导入的System.Windows.Forms命名空间。即便全局已经执行using namespace System.Windows.Forms或Add-Type -AssemblyName System.Windows.Forms,类内部仍无法直接识别MessageBoxButtons、DialogResult这类简写类型。而OpenFileDialog能正常运行,大概率是代码中使用了全限定类名,或该控件的调用触发了程序集隐式加载,但MessageBox相关枚举/类型未被隐式解析。
解决方式:在类定义前添加using namespace System.Windows.Forms,或在类内使用全限定类型名(如[System.Windows.Forms.MessageBoxButtons])。类定义与程序集加载顺序异常
如果脚本中类定义的位置移到了Add-Type -AssemblyName System.Windows.Forms之前,类解析类型时程序集尚未加载,就会出现找不到类型的错误。之前正常运行可能是类定义在加载语句之后,某次修改打乱了顺序。类型引用的简写冲突
若类内部存在同名的自定义类型或变量,会导致MessageBoxButtons这类简写类型被错误解析,而非指向System.Windows.Forms下的对应类型。此时必须使用全限定名明确指定类型来源。环境或脚本隐性修改
比如脚本中新增的代码覆盖了全局命名空间导入,或者PowerShell运行环境的配置变更(如执行策略、模块加载情况),导致类作用域的类型解析逻辑异常。
示例修正后的类代码:
# 全局导入命名空间,类定义可直接使用简写类型 using namespace System.Windows.Forms Add-Type -AssemblyName System.Windows.Forms class Preferences { [void]InitPref() { $dialogResult = [MessageBox]::Show("确认操作?", "提示", [MessageBoxButtons]::YesNo) if ($dialogResult -eq [DialogResult]::Yes) { # 执行后续逻辑 } } }
内容的提问来源于stack exchange,提问作者sapph

