winget-cli 配置 PowerShell 模块:Microsoft.WinGet.Configuration Cmdlet 架构与依赖加载机制详解
winget-cli 配置 PowerShell 模块Microsoft.WinGet.Configuration Cmdlet 架构与依赖加载机制详解【免费下载链接】winget-cliWinGet is the Windows Package Manager. This project includes a CLI (Command Line Interface), PowerShell modules, and a COM (Component Object Model) API (Application Programming Interface).项目地址: https://gitcode.com/gh_mirrors/wi/winget-cliWindows 包管理器winget-cli的配置Configuration能力可以通过 PowerShell 模块Microsoft.WinGet.Configuration直接驱动。本篇文章基于 winget-cli 仓库中 Microsoft.WinGet.Configuration 模块 README结合该模块 Cmdlets 与 Engine 两个工程的实际源码系统讲解其组成结构、核心 Cmdlet 的语法与使用方式、本地构建流程以及模块为规避程序集依赖冲突而设计的自定义AssemblyLoadContext加载机制。读完本文你将能够安装并调用这套 Cmdlet 完成配置文件的解析、查看与执行并理解在 PowerShell 模块中安全加载 WinRT 依赖的工程实践。模块组成Cmdlets 与 Engine 双层架构Microsoft.WinGet.Configuration模块在源码仓库中由两个独立的 .NET 工程构成职责清晰分离Microsoft.WinGet.Configuration.Cmdlets工程目录包含所有 Cmdlet 的实现是 PowerShell 直接加载的二进制层。Microsoft.WinGet.Configuration.Engine工程目录承载 Cmdlet 背后的真实业务逻辑封装了对 WinGet 配置处理器的调用。这种薄壳 Cmdlet 厚逻辑 Engine的分层设计与仓库中同级的Microsoft.WinGet.Client模块保持一致Client.Cmdlets/Client.Engine便于统一复用底层的配置处理逻辑并降低每个 Cmdlet 类的复杂度。在 模块清单 中可以看到模块的根二进制正是Microsoft.WinGet.Configuration.Cmdlets.dll即模块导入时加载的是 Cmdlets 层。核心 Cmdlet 一览原文档列出模块对外暴露的 5 个核心 Cmdlet。结合 模块清单 与 Cmdlets 目录当前仓库版本实际导出了 10 个 Cmdlet下表将 5 个核心 Cmdlet 与补充 Cmdlet 一并列出Cmdlet别名作用源码文件Get-WinGetConfigurationgwgc打开解析一个配置集支持从文件或历史记录加载GetWinGetConfigurationCmdlet.csGet-WinGetConfigurationDetailsgwgcd获取配置集中各配置单元unit的详细信息GetWinGetConfigurationDetailsCmdlet.csInvoke-WinGetConfigurationiwgc应用配置并同步等待完成InvokeWinGetConfigurationCmdlet.csStart-WinGetConfigurationsawgc启动应用配置不等待完成后台执行StartWinGetConfigurationCmdlet.csComplete-WinGetConfigurationcmpwgc完成先前由Start启动的配置任务并等待结果CompleteWinGetConfigurationCmdlet.csTest-WinGetConfigurationtwgc测试配置集不实际应用TestWinGetConfigurationCmdlet.csConfirm-WinGetConfigurationcnwgc确认配置集可应用性ConfirmWinGetConfigurationCmdlet.csStop-WinGetConfigurationspwgc停止正在运行的配置任务StopWinGetConfigurationCmdlet.csRemove-WinGetConfigurationHistoryrwgch删除配置历史记录RemoveWinGetConfigurationHistoryCmdlet.csConvertTo-WinGetConfigurationYamlctwgcy将配置集转换为 YAML 文本ConvertToWinGetConfigurationYamlCmdlet.cs说明模块清单中Prerelease alpha、ModuleVersion 0.0.1当前为预发布alpha状态实际发布版可通过 PowerShell Gallery 安装见下文示例脚本。Cmdlet 语法与参数详解原文档给出的核心语法如下Get-WinGetConfiguration -File string [CommonParameters] Get-WinGetConfigurationDetails -Set PSConfigurationSet [CommonParameters] Invoke-WinGetConfiguration -Set PSConfigurationSet [-AcceptConfigurationAgreements] [CommonParameters] Start-WinGetConfiguration -Set PSConfigurationSet [-AcceptConfigurationAgreements] [CommonParameters] Complete-WinGetConfiguration -ConfigurationJob PSConfigurationJob [CommonParameters]结合源码可以对参数做进一步说明Get-WinGetConfiguration -File string传入配置文件如.yaml/.yml或.json路径返回一个PSConfigurationSet对象。默认参数集为OpenConfigurationSetFromFile见 GetWinGetConfigurationCmdlet.cs。从源码看它还有另外两个参数集OpenConfigurationSetFromHistory配合-InstanceIdentifier与OpenAllConfigurationSetsFromHistory可用于从配置历史中恢复并支持-ModulePath、-ExecutionPolicy、-ProcessorPath、-CanUseTelemetry等高级参数。Get-WinGetConfigurationDetails -Set PSConfigurationSetSet参数位于 Position 0 且Mandatory true同时支持管道传入ValueFromPipeline/ValueFromPipelineByPropertyName这意味着可直接把上一个 Cmdlet 的输出管道进来。它返回PSGetConfigurationDetailsResult包含每个配置单元的详细状态。Invoke-WinGetConfiguration -Set PSConfigurationSet [-AcceptConfigurationAgreements]同步应用配置直到完成才返回。若不传-AcceptConfigurationAgreements会触发协议确认交互。Start-WinGetConfiguration -Set PSConfigurationSet [-AcceptConfigurationAgreements]异步启动立即返回一个PSConfigurationJob对象适合长任务。Complete-WinGetConfiguration -ConfigurationJob PSConfigurationJob接收Start返回的PSConfigurationJob阻塞等待配置完成并输出结果。从 InvokeWinGetConfigurationCmdlet.cs 可以看到 Cmdlet 的实现骨架BeginProcessing中先调用ConfigurationCommand.ConfirmConfigurationProcessing确认协议ProcessRecord中创建ConfigurationCommand并执行Apply(this.Set)StopProcessing中调用runningCommand.Cancel()支持中断。这些 Cmdlet 大多实现了StopProcessing重写因此在 PowerShell 中按CtrlC可以取消正在执行的配置任务。协议确认Agreements逻辑ConfigurationCommand.cs 中的ConfirmConfigurationProcessing静态方法揭示了协议确认的完整逻辑若用户已传-AcceptConfigurationAgreements直接返回true但仍会调用WriteWarning打印一条警告信息——即使设置了WarningActionPreference.Ignore也保证协议未被接受时用户能看到提示若未传该开关则调用psCmdlet.ShouldContinue弹出确认提示并根据是/否全部yesToAll / noToAll决定结果。该 Cmdlet 的Apply/StartApply路径最终都会走到 Engine 层经由Microsoft.Management.Configuration.Processor调用真实的配置处理器。环境前置条件模块运行的最低 PowerShell 7 版本为7.2.8原文档声明。此外从 模块清单 可见CompatiblePSEditions Core仅兼容 PowerShell Core7.x不支持 Windows PowerShell 5.1PowerShellVersion 7.4.6仓库当前构建目标为 PowerShell 7.4.6底层依赖 Windows 的 WinRT 配置 APIMicrosoft.Management.Configuration.dll按 x86 / x64 架构分别存放因此运行环境为 Windows。遥测Telemetry模块默认启用遥测Telemetry。如要关闭需要设置环境变量$env:POWERSHELL_TELEMETRY_OPTOUT 1 # 或 yes / true该环境变量的取值接受1、yes、true三种形式。这与仓库中其他 PowerShell 模块如Microsoft.WinGet.Client的遥测开关约定一致。本地构建与模块输出位置构建Microsoft.WinGet.Configuration.Cmdlets工程后Microsoft.WinGet.ConfigurationPowerShell 模块会出现在输出目录的PowerShell文件夹下。例如以 x64 Release 配置构建时模块文件位于$(SolutionDirectory)/src/x64/Release/PowerShell也就是说构建后可直接将PowerShell目录加入PSModulePath或用Import-Module指向其中的Microsoft.WinGet.Configuration.psd1进行本地验证。新增 Cmdlet 与依赖加载机制核心工程实践为什么需要自定义 AssemblyLoadContextPowerShell 允许用户在会话中导入多个模块不同模块可能携带同名但不同版本的程序集从而引发程序集依赖冲突assembly dependency conflicts。为了隔离依赖本模块使用了自定义的AssemblyLoadContextALC来加载所有依赖避免与其他应用或模块发生冲突。加载流程与原文档描述一致Microsoft.WinGet.Configuration.Cmdlets.dll是模块导入时加载的入口二进制当Microsoft.WinGet.Configuration.Engine.dll被请求加载时解析处理器resolving handler使用自定义 ALC 加载它之后Engine 的所有依赖都会在该自定义上下文中加载。对应实现见 WinGetAssemblyLoadContext.cs这是一个单例的AssemblyLoadContextisCollectible: falseResolvingHandler先在SharedDependencies中查找应走默认上下文的程序集再在DirectDependencies中查找并交给WinGetAcl.LoadFromAssemblyName加载。而 ModuleInit.cs 实现了IModuleAssemblyInitializer在模块导入时把AssemblyLoadContext.Default.Resolving与ResolvingUnmanagedDll两个事件挂接到上述处理函数模块移除OnRemove时反注册确保不污染全局加载行为。依赖目录布局当前依赖按三个目录组织原文档的Current layoutMicrosoft.WinGet.Configuration.Cmdlets.dll DirectDependencies\Microsoft.WinGet.Configuration.Engine.dll SharedDependencies\Microsoft.Management.Configuration.Processor.dll SharedDependencies\Microsoft.Windows.SDK.NET.dll SharedDependencies\WinRT.Runtime.dll SharedDependencies\x64\Microsoft.Management.Configuration.dll SharedDependencies\x64\Microsoft.Management.Configuration.Projection.dll SharedDependencies\x86\Microsoft.Management.Configuration.dll SharedDependencies\x86\Microsoft.Management.Configuration.Projection.dll目录职责如下DirectDependencies存放解析处理器主动查找并交由自定义 ALC 加载的程序集当前主要是Engine.dllSharedDependencies存放自定义 ALC 能够加载的其余托管依赖SharedDependencies\x64/SharedDependencies\x86按进程架构x64 / x86区分的原生 WinRT 互操作程序集。从 WinGetAssemblyLoadContext.cs 看架构目录名由RuntimeInformation.ProcessArchitecture.ToString().ToLower()计算模块导入时也会校验进程架构必须是 X86 / X64 / Arm64 之一见 ModuleInit.cs。特例WinRT.Runtime.dll原文档特别强调了一个例外WinRT.Runtime.dll不支持在同一进程中被加载多次因为这会影响到 CLR 内部的静态状态。因此它被特殊处理由默认加载器Default Loader加载而不是放入自定义 ALC。在 WinGetAssemblyLoadContext.cs 中可以看到DefaultContextAssemblies常量数组其中包含WinRT.Runtime.dll。ResolvingHandler一旦发现请求的程序集名命中该列表会直接从SharedDependencies中加载到AssemblyLoadContext.Default避免出现 Attempt to update previously set global instance 之类的错误。依赖关系图原文档给出的 mermaid 依赖图揭示了完整的加载关系解读Cmdlets.dll和WinRT.Runtime.dll由默认加载器加载Engine.dll及其余托管依赖由自定义 ALC 加载Engine.dll依赖的其他程序集在 ALC 内解析但Engine.dll中涉及 WinRT 运行时的部分会回落到默认上下文中的WinRT.Runtime.dll。新增 Cmdlet 时的依赖放置规则如果新增 Cmdlet 引入了新的程序集依赖必须将其放入上述布局的正确位置。具体做法是修改Microsoft.WinGet.Configuration.Cmdlets.csproj中的AfterBuild 任务该工程文件位于 Microsoft.WinGet.Configuration.Cmdlets.csproj在构建后将对应 DLL 复制到DirectDependencies、SharedDependencies或按架构区分的子目录中保证运行时解析处理器能找到它。实战完整使用流程仓库在 Examples 目录 提供了两份可直接参考的示例脚本覆盖同步与异步两种用法。同步执行Invoke 模式Sample_InvokeConfiguration.ps1 展示了最小完整流程param ( [Parameter(Mandatory)] $configFile ) if (-not(Get-Module -Name Microsoft.WinGet.Configuration -ListAvailable)) { Install-Module Microsoft.WinGet.Configuration -AllowPrerelease } Import-Module Microsoft.WinGet.Configuration $configSet Get-WinGetConfiguration -File $configFile # 调用该 Cmdlet 不是必须的但若未提前调用 # Invoke/Start 也会在内部执行这一步骤。 $configSet Get-WinGetConfigurationDetails -Set $configSet # 可选加 -AcceptConfigurationAgreements 直接接受协议。 Invoke-WinGetConfiguration -Set $configSet要点通过Install-Module Microsoft.WinGet.Configuration -AllowPrerelease安装预发布版本Get-WinGetConfiguration -File解析配置文件得到$configSetGet-WinGetConfigurationDetails可选用于提前拉取各配置单元的详情Invoke/Start 内部也会执行Invoke-WinGetConfiguration同步应用直到完成才返回。异步执行Start Complete 模式Sample_StartConfiguration.ps1 展示了两阶段异步执行param ( [Parameter(Mandatory)] $configFile ) if (-not(Get-Module -Name Microsoft.WinGet.Configuration -ListAvailable)) { Install-Module Microsoft.WinGet.Configuration -AllowPrerelease } Import-Module Microsoft.WinGet.Configuration # 在后台启动配置 $configJob Get-WinGetConfiguration -File $configFile | Start-WinGetConfiguration # 阻塞直到配置完成若已结束则直接输出结果。 Complete-WinGetConfiguration -ConfigurationJob $configJob要点Start-WinGetConfiguration支持管道输入-Set参数声明了ValueFromPipeline所以可以直接把Get-WinGetConfiguration的结果管道进来返回的$configJob是PSConfigurationJob对象Complete-WinGetConfiguration接收该任务对象并阻塞等待适合需要先做其他工作、稍后再收集结果的场景。与配置处理器Processor的关系从 Engine 层看ConfigurationCommand.cs 定义了两种配置处理器引擎常量dscv3DSC v3默认推荐与pwshPowerShell DSC并维护了 DSC v3 在 Microsoft Store 中的稳定版与预览版包 ID9NVTPZWRC6KQ/9PCX3HX4HZ0Z以及相关组策略WinGet、Configuration、WinGetCommandLineInterfaces的校验。也就是说模块的Apply/Test等操作最终通过Microsoft.Management.Configuration.Processor调度到底层的 DSC v3 资源处理器执行这正是ConfigurationCommand构造函数中传入策略集合的用意见 ConfigurationCommand.cs。小结Microsoft.WinGet.Configuration是 winget-cli 配置能力的 PowerShell 入口采用 Cmdlets薄壳与 Engine核心逻辑双层结构对外提供Get/GetDetails/Invoke/Start/Complete等核心 Cmdlet当前仓库版本还扩展了Test/Confirm/Stop/Remove-WinGetConfigurationHistory/ConvertTo-WinGetConfigurationYaml。其最值得借鉴的工程实践是通过自定义AssemblyLoadContext配合DirectDependencies/SharedDependencies分层目录在 PowerShell 模块中隔离依赖版本冲突并针对WinRT.Runtime.dll做默认上下文加载的特例处理。读者可结合 模块 README、Cmdlets 工程、Engine 工程 与 示例脚本 继续深入。【免费下载链接】winget-cliWinGet is the Windows Package Manager. This project includes a CLI (Command Line Interface), PowerShell modules, and a COM (Component Object Model) API (Application Programming Interface).项目地址: https://gitcode.com/gh_mirrors/wi/winget-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

猫抓新手完全指南:浏览器视频下载与资源嗅探四步搞定

猫抓新手完全指南:浏览器视频下载与资源嗅探四步搞定

猫抓新手完全指南:浏览器视频下载与资源嗅探四步搞定 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 网页上的视频想存下来&#xff0c…

2026/9/21 22:58:10 阅读更多 →
PEFT 中的 RoAd(2D 旋转适配):从原理到微调、量化与混合批次推理的完整实践指南

PEFT 中的 RoAd(2D 旋转适配):从原理到微调、量化与混合批次推理的完整实践指南

PEFT 中的 RoAd(2D 旋转适配):从原理到微调、量化与混合批次推理的完整实践指南 【免费下载链接】peft 🤗 PEFT: State-of-the-art Parameter-Efficient Fine-Tuning. 项目地址: https://gitcode.com/gh_mirrors/pe/peft R…

2026/9/20 21:09:26 阅读更多 →
Gatsby 项目启用 Flow 类型检查:gatsby-plugin-flow 使用指南与实现原理解析

Gatsby 项目启用 Flow 类型检查:gatsby-plugin-flow 使用指南与实现原理解析

Gatsby 项目启用 Flow 类型检查:gatsby-plugin-flow 使用指南与实现原理解析 【免费下载链接】gatsby React-based framework with performance, scalability, and security built in. 项目地址: https://gitcode.com/gh_mirrors/ga/gatsby gatsby-plugin-fl…

2026/9/20 21:09:26 阅读更多 →

最新新闻

什么是以太网新手避坑3个坑让代码跑通

什么是以太网新手避坑3个坑让代码跑通

什么是以太网新手避坑3个坑让代码跑通 复制来的代码跑不通,是不是让你抓狂?明明照着文档敲,环境也装好了,结果一执行就报 Connection refused 或者 Timeout…

2026/9/21 23:45:33 阅读更多 →
简谱怎么看保姆级教程:源码级拆解让你看懂核心逻辑

简谱怎么看保姆级教程:源码级拆解让你看懂核心逻辑

简谱怎么看保姆级教程:源码级拆解让你看懂核心逻辑 看了一堆简谱教程,为什么一到实战就懵?很多人抱怨学了很多理论,写项目或者扒谱时还是抓瞎。其实问题不在你不够聪明,而在那些教程只教你“认音符”,没教你“读逻辑”。今天这篇保姆级教程,不整虚的,…

2026/9/21 23:45:33 阅读更多 →
Win7吧实战项目踩坑:3个API变更让你少加班

Win7吧实战项目踩坑:3个API变更让你少加班

Win7吧实战项目踩坑:3个API变更让你少加班 版本升级后 API 全变了,这是无数老程序员在接手 Win7 吧相关 实战项目 时的第一反应。很多人觉得 Win7 都停服好几年了,怎么还有这么多坑?别急,金融、工控、政务内网里,Win7…

2026/9/21 23:45:33 阅读更多 →
3天搞定陈康肃公尧咨善射最佳实践,面试官不吐不快

3天搞定陈康肃公尧咨善射最佳实践,面试官不吐不快

3天搞定陈康肃公尧咨善射最佳实践,面试官不吐不快 看了一堆教程还是不会写项目?别急着焦虑,我带你在大厂面试里摸爬滚打5年,见过太多候选人卡在这一步。你背了八股文,写了Demo,但一到真实业务场景就露怯,根本原因不是你不够聪明,而是没抓住【陈…

2026/9/21 23:45:33 阅读更多 →
Win10原版系统实战项目:3步解决开发环境崩溃报错

Win10原版系统实战项目:3步解决开发环境崩溃报错

Win10原版系统实战项目:3步解决开发环境崩溃报错 屏幕一黑,控制台刷出满屏红色 StackTrace,那种绝望感每个开发者都懂。刚配好的 Win10…

2026/9/21 23:45:33 阅读更多 →
2026最新框架图片加载全解析:5个坑让项目不崩

2026最新框架图片加载全解析:5个坑让项目不崩

2026最新框架图片加载全解析:5个坑让项目不崩 刚学完语法,面对空荡荡的项目目录是不是心里发毛?很多人卡在“代码能跑,但项目搭不起来”这一步,尤其是涉及静态资源时。2026最新的开发环境对性能要求更严,图片加载看似简单,实则是前端工程化的…

2026/9/21 23:44:33 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/21 15:36:51 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/21 15:36:51 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →