为何升级至PowerShell 6(pwsh.exe)后无法加载System.Windows.Forms?
为什么PowerShell 6调用System.Windows.Forms会失败?
根本原因
你遇到的问题本质是PowerShell 5.1和6+版本的底层运行框架差异:
powershell.exe(5.1)是基于Windows专属的.NET Framework开发的,而System.Windows.Forms本来就是.NET Framework里的原生桌面UI组件,所以能直接加载运行。- 但
pwsh.exe(6.2.3)是基于早期的.NET Core构建的——这一阶段的.NET Core主打跨平台服务器/控制台场景,完全砍掉了Windows桌面UI相关的库(包括System.Windows.Forms),所以你尝试加载这个程序集时才会抛出FileLoadException。
至于你看到的升级提示,是微软在推动用户迁移到跨平台的PowerShell版本,但早期的6.x版本确实牺牲了不少.NET Framework的专属功能,这就是你的弹窗功能失效的直接原因。
解决办法
根据你的需求,有几个实用的方案:
1. 升级到PowerShell 7.0及以上版本
从PowerShell 7.0开始,微软基于.NET Core 3.0(后续是.NET 5/6/7/8)重新构建,而.NET Core 3.0恢复了对Windows桌面组件的支持(仅限Windows平台)。操作步骤:
- 安装最新的PowerShell 7(直接下载官方安装包即可)
- 打开PowerShell 7,先安装Windows Forms的支持模块:
Install-Module -Name WindowsForms -Scope CurrentUser - 之后就能正常使用弹窗功能了,推荐用更现代的写法:
Add-Type -AssemblyName System.Windows.Forms [System.Windows.Forms.MessageBox]::Show("This is the Message text")
2. 继续用PowerShell 5.1处理UI场景
PowerShell 5.1是Windows的内置组件,不会被PowerShell 7替代,如果你只是需要Windows桌面弹窗功能,完全可以直接用powershell.exe来运行相关脚本——直接创建快捷方式指向它就行,不用纠结升级提示。
3. 跨版本调用(临时救急)
如果不想升级也不想换版本,还能在pwsh里间接调用5.1的功能:
powershell.exe -Command "[System.Windows.Forms.MessageBox]::Show('This is the Message text')"
这样就能在PowerShell 6环境里触发弹窗了。
内容的提问来源于stack exchange,提问作者bradgonesurfing
相关产品推荐
相关产品推荐

