← 文章 / 编程开发
InfoQ 6小时前 · 2026-08-31 16:20:52 · 2 阅读

Rx.NET 7.0 拆分 Windows UI 支持,大幅缩减应用部署体积

Rx.NET 7.0 现已发布。这一版本的改动重点明确,主要是为缩小 Windows 应用的部署体积。新版本将 WPF、Windows Forms、UWP 和 Windows Runtime 集成功能从核心 System.Reactive 包中拆分出去,避免自包含应用在明明用不到这些框架的情况下,仍然被带入几十 MB 的框架依赖。

Reactive Extensions for .NET 提供了基于 IObservable 的编程模型,以及用于组合异步和事件驱动数据流的一系列操作符。自从 2023 年 1 月英国公司 endjin 接手 Rx.NET 的维护工作,此后的几个版本主要集中在现代化改造和清理长期积累的技术债务,而不是继续大规模增加操作符。Rx.NET 7.0 延续了这一思路,新版本的核心功能改动基本就这一项。

问题主要出现在同时使用自包含部署或 Native AOT,以及 Windows 特定 TFM(Target Framework Moniker,目标框架名字)的应用中,例如 net8.0-windows10.0.19041。引用 System.Reactive 后,即使应用完全没有使用 WPF 或 Windows Forms,也可能导致完整的 WPF 和 Windows Forms 框架被打包进最终部署产物。根据 endjin 的说明,不启用裁剪时,这可能额外增加约 90 MB;启用裁剪后仍会增加约 47 MB;如果使用 Native AOT 构建,额外体积约为 11 MB。

Rx.NET 7.0 通过将 UI 相关功能拆分到独立的 NuGet 包中解决了这个问题,分别是 System.Reactive.Windows.FormsSystem.Reactive.WpfSystem.Reactive.WindowsRuntimeSystem.Reactive.Uwp。升级后,如果应用确实用到了这些集成能力,就需要显式添加对应的 NuGet 包。对于没有使用这些功能的项目,则无需修改源代码,而受影响的自包含部署则可以明显瘦身。

维护团队也尽量保证了拆包之后的二进制兼容性。旧版 UI API 仍然保留在 NuGet 包提供的运行时程序集(runtime assemblies)中,只是从引用程序集(reference assemblies)里移除了。这样一来,使用 Rx.NET 6.1 编译好的组件理论上仍然可以继续运行;而重新编译的应用则无法在没有添加对应包的情况下,不知不觉依赖 Windows UI 功能。System.Reactive 7.0 还加入了一个 Analyzer,可以检测受影响的源代码,并提示需要添加哪个包。

当然,这一版本也带来了一些破坏性变更。Rx.NET 7.0 不再支持 .NET 6 和 .NET 7,但继续支持 .NET 8、.NET 9、.NET 10、.NET Framework 4.7.2、.NET Standard 2.0 和 UWP。此外,该版本还修正了 OfType 的可空性标注(nullability annotations)。运行时行为并没有变化,但由于方法签名发生了变化,按照语义化版本(Semantic Versioning)的规则,这项改动在技术上也需要提升主版本号。

对于仍在使用旧式 packages.config 机制的项目,还存在一个特殊情况。由于这种格式无法区分 NuGet 的 reflib 资产,这类项目即使没有显式引用新的 UI 包,仍然可能看到这些 UI API。Rx.NET 维护团队并不支持这种配置,并表示未来可能会移除为兼容这一机制而保留的代码。

此前 Rx.NET 用户的讨论已经提到过 Windows 特定的打包问题,以及项目是否能够跟上现代 .NET 部署模型的问题。有开发者反映,在某些目标框架组合下,他们不得不自行绕过缺失的 Windows Scheduler API;也有人希望 Rx.NET 能进一步改善裁剪、AOT 支持以及包文档。目前 7.0 发布后的公开讨论还比较有限,因此现在判断社区对这一版本的整体反响还为时过早。

随着 7.0 发布,endjin 表示,接手 Rx.NET 维护工作时制定的路线图主要目标已经完成。后续工作可能会转向进一步减少内存分配、引入代码生成、探索对类似 ref 元素的支持,以及增加更多操作符。System.Reactive 7.0 已经可以通过 NuGet 获取;有关此次拆包设计以及后续开发计划的细节,则可以在 Rx.NET GitHub 仓库中查看。

查看英文原文:Rx.NET 7.0 Reduces Deployment Size by Splitting Windows UI Support

原始来源: InfoQ

评论 (0)