Visual Studio 2019无法定位Windows程序集:PoshWinRT库引用错误求助
解决PoshWinRT在Windows 10+PowerShell Core下的编译与程序集引用问题
我来帮你一步步搞定这个困扰你的问题——从Windows 7迁移到Win10后PoshWinRT编译失败,还要适配PowerShell Core(pwsh),核心问题就是WinRT程序集引用的路径和方式在Win10及.NET Core环境下发生了变化,咱们逐个解决:
1. 先找到Win10里正确的Windows.winmd位置
Windows 7里的WinRT程序集路径和Win10完全不同,Win10中Windows.winmd的默认路径是:
C:\Windows\System32\WinMetadata\Windows.winmd
先确认这个文件存在(正常Win10系统都会有),之前你看到解决方案里的依赖项显示文件被删除,就是因为项目还在找Win7时代的旧路径。
2. 修正项目的程序集引用
别再尝试添加System.Windows这类WPF程序集了,它们和WinRT完全是两回事。正确的操作是:
- 右键PoshWinRT项目 → 选择「添加」→「引用」
- 点击「浏览」,导航到上面的
C:\Windows\System32\WinMetadata路径,选中Windows.winmd添加 - 添加后,在引用列表里找到这个WinMD文件,右键→属性,确保「复制本地」设置为「False」(因为这是系统自带的程序集,不需要复制到输出目录)
3. 适配PowerShell Core的关键:改用NuGet包管理WinRT引用
PowerShell Core基于.NET Core/.NET 5+,原生支持WinRT的方式和.NET Framework不同,更推荐用官方的NuGet包来避免路径问题:
- 右键项目 → 「管理NuGet程序包」
- 搜索并安装
Microsoft.Windows.SDK.Contracts包(选择和你的Win10版本匹配的版本,比如Win10 21H2对应10.0.22000.282) - 安装完成后,删掉之前手动添加的
Windows.winmd引用,这个NuGet包会自动帮你引入所有必要的WinRT程序集,包括Windows.Foundation.IAsyncAction这类类型
4. 清理缓存并重新构建
之前的构建缓存可能残留了旧的引用信息,一定要做这两步:
- 删除项目目录下的
bin和obj文件夹 - 在Visual Studio里点击「生成」→「清理解决方案」,然后再「重新生成解决方案」
5. 调整项目目标框架(如果需要)
如果你的PoshWinRT项目还是目标.NET Framework(比如4.7.2),要适配PowerShell Core的话,建议把目标框架改成.NET 6或更高版本(.NET 6是LTS版本,更稳定):
- 右键项目 → 「属性」
- 在「应用」标签页的「目标框架」下拉菜单里选择
.NET 6.0(确保选带Windows的版本,比如.NET 6.0 (Windows))
做完这些,CS0012的错误应该就会消失,而且编译出来的程序集也能正常导入到pwsh中了。
内容的提问来源于stack exchange,提问作者xdhmoore
相关产品推荐
相关产品推荐

