如何用 WPF + .NET 10 打造 Windows 优化工具?optimizerDuck 技术栈拆解
【免费下载链接】optimizerDuckFree, open-source Windows optimization tool for performance, privacy, and simplicity.项目地址: https://gitcode.com/GitHub_Trending/op/optimizerDuck
optimizerDuck 是一款基于 WPF + .NET 10 构建的免费开源 Windows 优化工具,专注性能、隐私与简洁。本文完整拆解 optimizerDuck 的技术栈:从 Fluent 风格 WPF 界面、反射自动注册优化项,到基于 AsyncLocal 的异步执行作用域与可回滚系统,带你了解如何用现代 .NET 技术打造一款专业的 Windows 优化工具。
一个项目解决了什么问题
默认安装的 Windows 自带大量后台服务、遥测、预装应用和计划任务,很多用户根本用不到,却在持续消耗 CPU、内存和磁盘资源。同时,不少能提升性能的设置默认并未开启。
optimizerDuck 把这些能力整合到一个界面里,核心功能包括:
- 系统优化:40+ 项调优,覆盖 7 大分类(性能、隐私、GPU、电源、臃肿应用与服务、用户体验、AI),每项都标注风险等级
- 自定义设置:开关、下拉框、数字输入替代注册表手工修改,按桌面 / 偏好 / 游戏 / 系统功能四类组织
- 内置工具:系统仪表盘、启动项管理、计划任务管理、磁盘清理、臃肿应用卸载器
- 可回滚:每次修改都会写入本地回滚文件,支持单项撤销或全部还原
技术栈总览:核心组件一览
打开项目文件 optimizerDuck/optimizerDuck.csproj,整个依赖关系一目了然:
| 技术 | 版本 | 用途 |
|---|---|---|
WPF(net10.0-windows10.0.17763.0) | .NET 10 | Windows 桌面 UI 框架,目标 Windows 10 17763+ |
| WPF-UI | 4.3.0 | Fluent Design 控件、导航视图、对话框 |
| CommunityToolkit.Mvvm | 8.4.2 | MVVM 源生成器([ObservableProperty]、[RelayCommand]) |
| Microsoft.Extensions.Hosting | 10.0.10 | 依赖注入 + 托管服务容器 |
| Serilog | 4.4.0 | 结构化日志,写入本地文件 |
| Newtonsoft.Json | 13.0.4 | 回滚数据 JSON 序列化 |
| TaskScheduler | 2.12.2 | Windows 计划任务管理 |
| System.Management.Automation | 7.6.4 | PowerShell 宿主集成 |
| xUnit v3 | 3.2.2 | 独立测试项目 optimizerDuck.Test/ |
几个值得注意的工程细节:
- 单项目结构:应用本身只有一个 WPF 项目,没有拆分子项目,通过
Domain/、Services/、UI/、Common/目录分层 - 管理员权限:app.manifest 声明
requireAdministrator,因为工具要修改注册表和服务 - 新解决方案格式:使用
.slnx而非传统.sln
目录结构:按 MVVM 三层清晰分层
仓库根目录下的 AGENTS.md 是一份非常完善的工程说明,其中的结构约定值得借鉴:
Domain/— 模型、接口、特性,不依赖任何 UIOptimizations/:BaseOptimization基类、各分类下的具体优化项Conditions/:兼容性条件系统(Windows 版本、CPU/GPU 品牌、内存阈值等)Revert/:5 种回滚步骤类型(注册表、服务、计划任务、Shell 命令、USB 电源)
Services/— 业务逻辑:注册表 / 服务 / 计划任务 / Shell 四大 Provider、回滚管理器、系统信息快照UI/— XAML 页面、ViewModel、对话框与样式Common/— 扩展方法、辅助类、WPF 值转换器
这种"领域层零 UI 依赖"的分层,让优化逻辑可以被 optimizerDuck.Test/ 中的 xUnit 测试直接验证,而不需要启动界面。
亮点一:反射自动注册,新增优化项零手工登记
大多数同类工具的每个功能都要手动写一行注册代码,而 optimizerDuck 的做法是:新增一个优化项,只需在分类类里加一个嵌套类。
每个优化项继承 BaseOptimization,并用特性声明元数据:
[Optimization( Id = "固定GUID", Risk = OptimizationRisk.Safe, Tags = OptimizationTags.Performance, Condition = typeof(Windows11Condition) // 可选:兼容性门控 )] public sealed class MyTweak : BaseOptimization { ... }特性的完整定义见 OptimizationAttribute.cs。启动时,OptimizationRegistry 通过反射扫描程序集中所有IOptimizationCategory实现,再收集其嵌套的IOptimization类型并实例化。整个过程在后台线程执行,避免阻塞启动,且扫描结果有缓存。
💡 这种"约定优于配置"的注册方式,让 7 大分类、40+ 优化项的扩展成本趋近于零——没有注册数组需要维护,特性即元数据。
亮点二:AsyncLocal 执行作用域 + 文件级回滚
修改系统设置最让人担心的是"改坏了怎么办"。optimizerDuck 的设计核心是每一步修改都自动记录回滚步骤,而它靠的是一个优雅的技巧:ExecutionScope 使用AsyncLocal<ExecutionScope?>作为环境上下文。
它的工作方式:
- 应用优化项时开启
ExecutionScope.Begin() - Provider 服务(注册表、服务、计划任务、Shell)执行操作时,直接从
ExecutionScope.Current读取当前作用域,自动记录回滚步骤——无需层层传参,也无需依赖注入 - 作用域结束时,RevertManager 把成功步骤序列化为 JSON,写入
%LocalAppData%\optimizerDuck\Revert\{optimizationId}.json
工程上还做了三个防御性设计:
- 原子写入:先写
.tmp再File.Replace,崩溃不会产生半截文件 - 并发锁:每个回滚文件配
SemaphoreSlim(30 秒超时),防止竞态 - 状态推断:是否已应用直接由"文件是否存在"推断,简单可靠
界面侧只需调用 BaseOptimization.CompleteFromScope() 从作用域直接构建执行结果,优化项本身完全不用关心回滚细节。
亮点三:兼容性条件系统
不同 Windows 版本、不同硬件的机器能用的调优并不相同。项目为此设计了独立的条件系统(Domain/Conditions/):
- 内置条件包括 Windows11Condition、CPU/GPU 品牌判断、最低内存阈值等
- 特性中声明
Condition = typeof(...)即可门控某个优化项 - 求值采用fail-open策略:信息不足时宁可显示、也不隐藏,避免误伤可用功能
这样同一个安装包可以在 Windows 10 与 11 上安全运行,不合适的条目自动标记为"不受支持"。
应用骨架:Generic Host 驱动 WPF
传统 WPF 应用靠App.xaml.cs里的手工装配,而 optimizerDuck 直接采用 .NET 生态标准的Host.CreateDefaultBuilder()模式(见 App.xaml.cs):
- 所有页面与 ViewModel 以单例注册进 DI 容器
- 配置从
appsettings.json读取,绑定到AppSettings - Serilog 接管日志,还自定义了日志格式器让输出更易读
- 全局捕获三类未处理异常(AppDomain / Task / Dispatcher),并落盘崩溃日志到
Crashes/目录
这带来一个直接好处:应用逻辑与 UI 彻底解耦,测试项目里可以直接注入NullLogger验证真实文件与注册表 I/O,无需任何 mock 库。
国际化与测试
- 17 种语言:资源文件集中在 Resources/Languages/,每个语言一个
.resx,禁止硬编码 UI 字符串 - 集成风格测试:optimizerDuck.Test/ 基于 xUnit v3,不引入 mock 库,全部手写测试替身;涉及 WPF 的测试运行在 STA 线程中
- 本地构建:
dotnet build optimizerDuck.slnx一条命令即可从源码构建,开源项目(GPL v3)透明可审计
如何本地构建运行
克隆仓库后即可在 Windows 上构建(需管理员权限运行):
dotnet restore optimizerDuck.slnx dotnet build optimizerDuck.slnx --configuration Release --no-restore dotnet run --project optimizerDuck/optimizerDuck.csproj详细的构建、测试与代码规范约定都写在 AGENTS.md 中,包括 CI 对齐的构建命令和测试过滤方式。
总结:可以带走的 5 个实践
- WPF + WPF-UI依然是构建 Fluent 风格 Windows 桌面工具的最优解,配合 .NET 10 的 Windows 目标框架开箱即用
- Generic Host + DI让 WPF 应用获得现代 .NET 的配置、日志与测试能力
- 反射 + 特性实现功能自动发现,扩展成本趋近于零
- AsyncLocal 环境作用域是跨层传递执行上下文的轻量方案,替代层层传参
- 文件即状态的回滚设计简单可靠:原子写入 + 并发锁 + 文件存在性推断
从技术栈选型到工程细节,optimizerDuck 为"用 WPF + .NET 10 打造系统级工具"提供了一个完整可参考的样本。
【免费下载链接】optimizerDuckFree, open-source Windows optimization tool for performance, privacy, and simplicity.项目地址: https://gitcode.com/GitHub_Trending/op/optimizerDuck
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考