VS Code PowerShell扩展运行自定义.NET Cmdlet报错的解决咨询
问题说明
我们基于.NET开发了一款Cmdlet,将其导入脚本后,在VS Code的PowerShell扩展中运行时出现以下错误:
"Method 'AsPages' in type 'FuncAsyncPageable`1' from assembly 'Azure.Data.AppConfiguration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=92742159e12e44c8' does not have an implementation."
但在标准pwsh会话中运行相同脚本却能正常执行。此外,调用Add-Platform -Street "US" -GlobalCustomerCode "CUST1" -Key "CompanyCode" -Value "CUST1"的预期返回JSON格式如下:
{"Id":135,"Street":"US","Environment":null,"GlobalCustomerCode":"CUST1","LocalCustomerCode":null,"Prefix":null,"Key":"CompanyCode","Value":"CUST1","LastUpdate":"2023-04-27T13:58:09.7374123Z"}
解决步骤
对齐VS Code与标准会话的PowerShell版本
分别在VS Code的PowerShell终端和标准pwsh会话中执行$PSVersionTable.PSVersion,对比两者版本。若不一致,在VS Code设置中搜索PowerShell: Default Shell,选择和标准会话相同的pwsh版本,重启VS Code后测试。排查并解决程序集版本冲突
错误源于Azure.Data.AppConfiguration1.2.0.0版本的方法实现缺失,大概率是VS Code环境加载了不兼容的程序集版本:- 在标准pwsh中执行
Get-Module -ListAvailable Azure.Data.AppConfiguration,记录已安装的兼容版本; - 在VS Code终端执行相同命令,对比版本差异;
- 若VS Code中加载了旧版本,在导入模块时指定明确版本,比如
Import-Module Azure.Data.AppConfiguration -RequiredVersion <兼容版本号>; - 同时更新自定义Cmdlet项目中的NuGet包,将
Azure.Data.AppConfiguration升级到稳定兼容版本(如1.3.0及以上),重新编译模块。
- 在标准pwsh中执行
清理VS Code的PowerShell环境缓存
- 关闭VS Code,删除对应系统下的Azure模块缓存目录:
- Windows:
%USERPROFILE%\AppData\Local\Microsoft\PowerShell\7\Modules(pwsh 7)或%USERPROFILE%\Documents\WindowsPowerShell\Modules(Windows PowerShell); - macOS/Linux:
~/.local/share/powershell/Modules;
- Windows:
- 重新打开VS Code,重新导入模块测试。
- 关闭VS Code,删除对应系统下的Azure模块缓存目录:
配置调试环境以支持Cmdlet调试
要在VS Code中调试自定义Cmdlet,需完成以下配置:- 确保安装最新版的PowerShell扩展;
- 在脚本所在目录创建
launch.json配置文件,示例如下:{ "version": "0.2.0", "configurations": [ { "name": "PowerShell: 启动脚本", "type": "PowerShell", "request": "launch", "script": "${file}", "args": [], "cwd": "${fileDirname}" } ] } - 将自定义Cmdlet的编译输出路径添加到VS Code终端的
$env:PSModulePath中,确保模块能被正确加载。
验证模块加载过程
在VS Code终端执行Import-Module <你的自定义模块名> -Force -Verbose,查看加载日志,确认是否有程序集加载失败或版本冲突的提示,根据提示调整依赖项。
内容的提问来源于stack exchange,提问作者Eric F.

